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