У меня есть исполняемый файл, с которым нужно libtest.so
динамически связываться , поэтому я помещаю их в тот же каталог, затем:
cd path_to_dir
./binary
Но получил это:
error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
Как он не может найти, libtest.so
который уже находится в том же каталоге, что и сам исполняемый файл?
linux
autoloader
linuxer
источник
источник
echo $LD_LIBRARY_PATH
на моей машине пусто :(:
), а не точкой с запятой.Хотя вы можете установить LD_LIBRARY_PATH, чтобы динамический компоновщик знал, где искать, есть лучшие варианты. Вы можете поместить свою общую библиотеку в одно из стандартных мест, список этих мест см. В
/etc/ld.so.conf
(для Linux) и/usr/bin/crle
(в Solaris)Вы можете перейти
-R <path>
к компоновщику при сборке вашего двоичного файла, который добавит<path>
в список каталогов, отсканированных для вашей общей библиотеки. Вот пример. Во-первых, показывая проблему:libtest.h:
libtest.c:
Привет:
Makefile (вкладки должны быть использованы):
Давайте запустим это:
Как это исправить? Добавьте
-R <path>
к флагу компоновщика (здесь, путем настройкиLDFLAGS
).Глядя на двоичный файл, вы можете увидеть, что ему нужно
libtest.so.0
:Двоичный файл будет искать свои библиотеки, кроме стандартных мест, в указанном каталоге:
Если вы хотите, чтобы двоичный файл смотрел в текущем каталоге, вы можете установить RPATH в
$ORIGIN
. Это немного сложно, потому что вам нужно убедиться, что знак доллара не интерпретируется маркой. Вот один из способов сделать это:источник
make
, например, при ручном вызовеg++
, попробуйте-Wl,-rpath='$ORIGIN'
(обратите внимание на одинарные кавычки), чтобы предотвратить$ORIGIN
расширение до пустой строки.Чтобы загрузить общие объекты из той же директории, что и ваш исполняемый файл, просто выполните:
Примечание: это не изменит переменную LD_LIBRARY_PATH вашей системы. Изменение влияет только на это, и только на это, выполнение вашей программы.
источник
Для любого, кто все еще борется без ответа, я нашел один со следующим предложением:
Вы можете попробовать обновить ld.so.cache, используя:
sudo ldconfig -v
Работал на меня.
источник
Для тех, кто использует CMake для своей сборки, вы можете установить
CMAKE_EXE_LINKER_FLAGS
следующее:Это правильно распространит флаги компоновщика для всех типов сборки (например, Debug, Release и т. Д.), Чтобы сначала искать файлы .so в текущем рабочем каталоге.
источник
Динамический компоновщик решит, где искать библиотеки. В случае Linux, динамический компоновщик обычно
GNU ld.so
(или альтернатива, которая обычно ведет себя идентично по причинам совместимости).На цитаты из Википедии:
Источник: https://en.wikipedia.org/wiki/Rpath
источник