Где Ubuntu ищет общие библиотеки?


24

Когда я запускаю процесс, который связывается с общей библиотекой во время выполнения (связанный, когда процесс запускается, а не связанный позже dlload()), где он ищет этот .soфайл общей библиотеки ( ), кроме LD_LIBRARY_PATH?

Задний план:

У меня есть некоторый код C ++, который я написал, который использует определенную стороннюю библиотеку. Я установил библиотеку и скомпилировал мой код на двух разных платформах, как в Ubuntu, но в разных версиях, так и в разных версиях gcc. Библиотека была скомпилирована и установлена ​​из исходного кода и расположена /usr/local/libна обеих платформах. Когда я компилирую свой код, я связываюсь с pkg-config --libsпараметрами сторонней библиотеки и проверяю, что она pkg-config --libsвозвращает одинаковое значение на обеих платформах.

Мой код успешно компилируется на обеих платформах и LD_LIBRARY_PATHне определен (или определен как пустой :) ""на обеих платформах. Однако, когда я запускаю его на одной платформе, она работает нормально, а на другой я получаю эту ошибку:

error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory

Как ни странно, те, которые не работают, являются более новой версией Ubuntu и gcc. : /

Поэтому я пытаюсь выяснить, как работающий может найти библиотеку, так что я могу заставить сломанный найти библиотеку таким же образом. (т.е. без настройки LD_LIBRARY_PATH)

Обновить:

Вот мой вывод из cat /etc/ld.so.conf.d/*

... на работающей (старой) системе:

/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

... на сломанной (более новой) системе:

# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa

1
Я думаю, что эти места определены /etc/ld.so.conf.d/*.conf, но я не уверен в этом.
Салем

Похоже на это, но посмотрите в моём обновлении OQ содержимое этих файлов ... Так что похоже, что оно должно найти, /usr/local/lib/libthrift-0.9.0.soно все равно выдает ошибку error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... Есть ли какая-то причина, по которой он не может получить каталог /etc/ld.so.conf.d/*.conf?
Дейв Лиллетун,

3
Попробуйте запустить sudo ldconfig -vкак предложено ниже. Если это все еще не работает, обновите ваш вопрос с выводом ldd /path/to/your/application.
Салем

Ответы:


29

Весь этот путь бизнеса связан с тем, что называется многоархитектурой. По сути, это позволяет вам иметь 32-битные и 64-битные библиотеки в одной системе.

После того, как вы скопировали файл, вы запустили ldconfig?

ldconfig  creates,  updates,  and removes the necessary links and cache
       (for use by the run-time linker,  ld.so)  to  the  most  recent  shared
       libraries  found  in  the directories specified on the command line, in
       the file /etc/ld.so.conf, and in the trusted directories (/usr/lib  and
       /lib).   ldconfig  checks the header and file names of the libraries it
       encounters when determining which  versions  should  have  their  links
       updated.  ldconfig ignores symbolic links when scanning for libraries.

Я побежал, sudo ldconfigи это решило проблему! (Не нужно было перекомпилировать мой код или еще что-нибудь ...) Я просто хочу понять, хотя ... Вы сказали "После того, как вы скопировали файл", но я не скопировал файл. Вы имеете в виду после того, как я собрал и установил библиотеку, или после того, как я скомпилировал свою программу?
Дейв Лиллетун,

После того, как вы разместили его там, где вы его разместили. По сути, кеш библиотеки построен. Я думаю, что перезагрузка может также восстановить кеш.
Мэтт Х

Возможно, я ошибаюсь, но я полагаю, что я перезагрузился с момента установки библиотеки ... Однако, sudo ldconfigсделал свое дело. Является ли это тем, что библиотеки часто автоматически запускаются для вас как часть их установки, а эта по какой-то причине этого не сделала? Просто интересно, почему я «обычно» не должен это делать, а сделал только в этом случае ...
Дэйв Лиллетун,

Я думаю, что обычно пакет установки запускает ldconfig во время процесса установки. Возможно, версия вашего нового дистрибутива по какой-то причине этого не делает.
Мэтт Х

1

Информация, содержащаяся в вышеупомянутом вопросе И первый (и только ATT) ответ , помогла мне решить * похожую * проблему моего на WSL Ubuntu (на Win10 64)!

В моем случае исполняемый файл не может найти библиотеку. Я в конце концов заметил , что новоиспеченная библиотека получила расположенный в /usr/lib64, но в нескольких арочных линиях /etc/ld.so.conf.d/x86_64-linux-gnu.conf даже не включают в этот каталог.

Итак, я побежал

sudo ldconfig /usr/lib64

и это наконец исправило это. (запуск его без параметра каталога не позволил «волшебным образом» найти библиотеки, кстати.) Неясно, помог ли «перезапуск» моего WSL bash ... Я думаю, что это даже не нужно.


То же самое случилось со мной с / usr / local / lib /. Я создал файл /etc/ld.so.conf.d/usr-local.confи затем запустил sudo ldconfigбезрезультатно - библиотеки в этом каталоге не были найдены загрузчиком. После запуска sudo ldconfig /usr/local/libвсе работало нормально.
Джош Милторп
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.