Используйте общие библиотеки в / usr / local / lib

59

Я собрал несколько библиотек из исходников, а файлы после make installнаходятся в/usr/local/lib

Например, в моем случае у меня есть файл, libodb-2.2.soкоторый находится в этом каталоге.

Однако, когда я запускаю исполняемый файл, связанный с libodb, я получаю ошибку: ошибка при загрузке общих библиотек:libodb-2.2.so: cannont open shared object file: No such file or directory.

Означает ли это, что я собрал свой исполняемый файл не правильно? или я должен указать системе, что в папке /usr/local/libтакже могут быть интересные библиотеки ?

Я использую Ubuntu 12.04, ядро ​​Linux 3.2.0-38-generic.

Стефан Роллан
источник
askubuntu.com/questions/165027/… , stackoverflow.com/questions/17889799/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Я настоятельно рекомендую вам установить хорошие отношения дружбы с вашим отладчиком
DDS
@DDS Я предлагаю вам рассказать подробнее. Вы знаете, что это совместный сайт здесь. Пожалуйста, укажите способ, gdbкоторый помог бы в любом случае link, например, с проблемой. Мне искренне любопытно. Сначала ваше замечание кажется мне не связанным с проблемой. Но я могу ошибаться. Действительно я не знаю достаточно gdbи загрузки библиотек.
Стефан Роллан
Извините ... этот комментарий должен был быть помещен в stackoverflow на вопрос учащегося о программировании на C ... просто не видел, был U & L
DDS
@DDS Новичок в изучении программирования на C или в обучении на Linux? Пожалуйста, будьте точнее. Например, я пришел из Windows. Это не значит, что я не знаю C ++ ... Я склонен думать, что ваше осуждающее поведение не является точным. Даже если это было на SO, ваше поведение скоро привлечет внимание модераторов. Помните об этом. Вы находитесь на совместном сайте программистов-энтузиастов, которые делятся полезными знаниями. Не где-то дизайн, чтобы льстить вашему эго. (Не волнуйтесь, меня тоже слегка / разумно избили, когда я начал ТАК, и я думаю, что это было действительно хорошо, что случилось).
Стефан Роллан

Ответы:

59

Для текущей сессии вы можете

export LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

или внести изменения постоянного вы можете добавить /usr/local/libк /etc/ld.so.conf(или что - то она включает в себя) и запустить ldconfigкак корень.

Если у вас все еще есть проблемы, при запуске ldd [executable name]вы увидите библиотеки, которые пытаетесь найти, а какие нет.

Flup
источник
3
Со manстраницы ldd(1)«В обычном случае ldd вызывает стандартный динамический компоновщик (см. ld.so(8)) С установленной LD_TRACE_LOADED_OBJECTSпеременной среды 1, что заставляет компоновщик отображать зависимости библиотеки. Однако следует помнить, что в некоторых случаях некоторые версии lddмогут . попытаться получить информацию о зависимости, непосредственно выполняя программу Таким образом, вы никогда не должны использовать lddна ненадежном исполняемым ., так как это может привести к выполнению произвольного кода безопасной альтернативы при работе с ненадежными исполняемыми файлами является: ...»
SlySven
4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven
Хороший - я никогда не сталкивался с objdump раньше.
Flup
Согласно этой статье этот ответ является канонически неправильным и вредным . Для правильного подхода использование -Lи -rpathво время компиляции для установки связующего пути поиска и пути поиска во время выполнения для библиотек является правильным способом согласно этому вопросу и ответу.
Клифф Армстронг
37

Если вы уже запустили ldconfigпосле создания библиотеки, продолжайте читать. Если нет, сначала прочитайте об ldconfig .

/usr/local/libможет отсутствовать в пути к библиотеке, который использует ldconfig. Вы можете просто сделать это:

ldconfig /usr/local/lib

И материал должен быть добавлен в кеш компоновщика, но, вероятно, лучше правильно добавить путь. Убедитесь, что у вас есть /etc/ld.so.conf.dкаталог. Если это так, добавьте файл (назовите его «usr-local.conf» или как угодно) и вставьте в него одну строку:

/usr/local/lib

Теперь беги ldconfig. Если у вас нет каталога ld.so.conf.d, у вас должен быть /etc/ld.so.conf файл, и вы можете добавить эту строку в конец.

лютик золотистый
источник
3
Я добавил файл custom.conf в /etc/ld.so.conf.dsudoed ldconfig, чтобы принять его во внимание, и мой исполняемый файл можно запустить прямо сейчас.
Стефан Роллан