Как Вы указываете местоположение библиотек к двоичному файлу? (Linux)

Для этого вопроса я буду использовать определенный пример, но действительно это делает вывод к в значительной степени любому двоичному файлу на Linux, который, может казаться, не находит зависимые библиотеки it. Так, у меня есть программа, которая не будет работать из-за недостающих библиотек:

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory

ldd проливает некоторый свет на проблему:

linux-vdso.so.1 =>  (0x00007fff18b01000)
libcorona-1.0.2.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000)
libm.so.6 => /lib/libm.so.6 (0x00007f09755af000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000)
libc.so.6 => /lib/libc.so.6 (0x00007f0975040000)
libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)

Однако корона установлена:

oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null

/usr/local/lib64/libcorona-1.0.2.so
/home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so

Как я говорю двоичный файл, где искать "недостающую" библиотеку?

34
задан 16.12.2015, 20:31

2 ответа

Для некогда прочь, устанавливает переменную LD_LIBRARY_PATH к разделенному от двоеточия списку каталогов для поиска. Это походит PATH для исполняемых файлов, за исключением того, что стандартные системные каталоги дополнительно ищутся после того, как те указанные через среду.

LD_LIBRARY_PATH=/usr/local/lib64 ./cart5

Если у Вас есть программа, которая сохраняет библиотеки в нестандартном месте и не может найти их самостоятельно, можно записать сценарий обертки:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
else
  LD_LIBRARY_PATH=/usr/local/lib64
fi
export LD_LIBRARY_PATH
exec /path/to/cart5 "$@"

Список стандартных системных каталогов удерживается /etc/ld.so.conf. Недавние системы позволяют этому файлу включать другие файлы; если Ваш содержит что-то как include /etc/ld.so.conf.d/*.conf, создайте новый названный файл /etc/ld.so.conf.d/mala.conf содержа каталоги Вы хотите добавить. После изменения /etc/ld.so.conf или включенный файл, выполненный /sbin/ldconfig для Ваших изменений для вступления в силу (это обновляет кэш).

(LD_LIBRARY_PATH также относится ко многим другим нельдам, включая FreeBSD, NetBSD, OpenBSD, Солярис и Tru64. HP-UX имеет SHLIB_PATH и  Mac OS X имеет DYLD_LIBRARY_PATH. /etc/ld.so.conf имеет аналоги на большинстве нельдов, но местоположение и синтаксис отличаются более широко.)

43
ответ дан 07.12.2019, 09:03

Если Вы хотите избежать LD_LIBRARY_PATH, можно также сделать это, во время соединения:

gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \
    -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...

-Wl... используется, чтобы передать дополнительные команды компоновщику, и в этом случае, с-R, Вы говорите компоновщику хранить этот путь как "путь поиска по умолчанию" для .so.

Я сохраняю примечания многих маленьких подсказок как этот на моем сайте:

https://www.thanassis.space/tricks.html

15
ответ дан 07.12.2019, 09:03

Теги

Похожие вопросы