Где Ubuntu ищет общие библиотеки?
Когда я запускаю процесс, который связывается с общей библиотекой во время выполнения (связан, когда процесс запускается, позже не связан с 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
2 ответа
Весь этот путь бизнеса связан с тем, что называется многоархитектурой. По сути, это позволяет вам иметь 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.
Информация, содержащаяся в вышеупомянутом вопросе И первый (и только ATT) ответ, помогла мне решить * похожую * проблему моего на WSL Ubuntu (на Win10 64)!
В моем случае исполняемый файл не может найти библиотеку. В конечном итоге я заметил, что недавно созданная библиотека оказалась в /usr/lib64
, но многоарочные линии /etc/ld.so.conf.d/x86_64-linux-gnu.conf
не включал этот каталог.
Итак, я побежал
sudo ldconfig /usr/lib64
и это наконец исправило это. (запуск его без параметра каталога не позволил "волшебным образом" найти библиотеки, кстати.) Неясно, помог ли "перезапуск" моего WSL bash... Я думаю, что это даже не нужно.