it-swarm.com.ru

В / usr / local / lib выполняется поиск общих библиотек?

Ищется ли /usr/local/lib общих библиотек? У меня есть эта ошибка:

[[email protected] ~]$ whereis ffmpeg
ffmpeg: /usr/local/bin/ffmpeg
[[email protected] ~]$ ffmpeg
ffmpeg: error while loading shared libraries: libavcore.so.0: cannot open shared object file: No such file or directory
[[email protected] ~]$ ls /usr/local/lib/libav*
/usr/local/lib/libavcodec.a            /usr/local/lib/libavfilter.a
/usr/local/lib/libavcodec.so           /usr/local/lib/libavfilter.so
/usr/local/lib/libavcodec.so.52        /usr/local/lib/libavfilter.so.1
/usr/local/lib/libavcodec.so.52.108.0  /usr/local/lib/libavfilter.so.1.74.0
/usr/local/lib/libavcore.a             /usr/local/lib/libavformat.a
/usr/local/lib/libavcore.so            /usr/local/lib/libavformat.so
/usr/local/lib/libavcore.so.0          /usr/local/lib/libavformat.so.52
/usr/local/lib/libavcore.so.0.16.1     /usr/local/lib/libavformat.so.52.94.0
/usr/local/lib/libavdevice.a           /usr/local/lib/libavutil.a
/usr/local/lib/libavdevice.so          /usr/local/lib/libavutil.so
/usr/local/lib/libavdevice.so.52       /usr/local/lib/libavutil.so.50
/usr/local/lib/libavdevice.so.52.2.3   /usr/local/lib/libavutil.so.50.36.0
[[email protected]ssman ~]$ 
51
Leo Izen

Убедитесь, что ваш LD_LIBRARY_PATH настроен на включение всех каталогов, которые вы хотите найти, и затем протестируйте его снова.

Вы можете проверить это быстро с:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib ffmpeg

который установит его только для этого вызова.

Кроме того, вы можете редактировать /etc/ld.so.conf, который содержит каталоги по умолчанию, в которых выполняется поиск. Некоторые дистрибутивы Linux могут не включать /usr/local/lib в этот файл.

Обратите внимание, что вам также может потребоваться обновить кэш /etc/ld.so.cache, запустив ldconfig (от имени root или с Sudo).

65
paxdiablo

И да и нет

Программы имеют скомпилированное (хорошо, "связанное") представление о том, где находятся их библиотеки. Если программа ожидает найти свою библиотеку в /usr/local/lib, тогда она найдет.

Существует также программа с именем ldconfig и файл конфигурации с именем /etc/ld.so.conf и, скорее всего, /etc/ld.so.conf.d, которые используются для указания каталогов, специфичных для сайта.

Прочитайте "man ld.so", в котором перечислены другие кнопки, например переменная окружения LD_LIBRARY_PATH.

LD.SO(8)                   Linux Programmer’s Manual                  LD.SO(8)

NAME
       ld.so, ld-linux.so* - dynamic linker/loader

DESCRIPTION
       The  programs ld.so and ld-linux.so* find and load the shared libraries
       needed by a program, prepare the program to run, and then run it.
. . .

...а также...

LDCONFIG(8)                Linux Programmer’s Manual               LDCONFIG(8)

NAME
       /sbin/ldconfig - configure dynamic linker run time bindings

SYNOPSIS
       /sbin/ldconfig  [  -nNvXV ] [ -f conf ] [ -C cache ] [ -r root ] direc-
       tory ...
       /sbin/ldconfig -l [ -v ] library ...
       /sbin/ldconfig -p

DESCRIPTION
       ldconfig creates the necessary links  and  cache  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 (/lib
       and  /usr/lib).  The cache is used by the run-time linker, ld.so or ld-
       linux.so.  ldconfig checks the header and filenames of the libraries it
       encounters  when  determining  which  versions  should have their links
       updated.
. . .
12
DigitalRoss

От http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html :

Стандарты GNU рекомендуют по умолчанию устанавливать все библиотеки в/usr/local/lib при распространении исходного кода (и все команды должны идти в/usr/local/bin).

...

Список каталогов для поиска хранится в файле /etc/ld.so.conf. Многие производные от Red Hat дистрибутивы обычно не включают/usr/local/lib в файл /etc/ld.so.conf. Я считаю это ошибкой, и добавление/usr/local/lib в /etc/ld.so.conf является общим "исправлением", необходимым для запуска многих программ в системах, производных от Red Hat.

В Debian /etc/ld.so.conf содержит include /etc/ld.so.conf.d/*.conf, а /etc/ld.so.conf.d/libc.conf содержит

# libc default configuration
/usr/local/lib
12
Boris Burkov

IIRC, ld.so использует файл /etc/ld.so.conf для вывода списка каталогов для поиска общих объектов. Вы также можете использовать переменную окружения LD_LIBRARY_PATH.

Заголовки ELF в linux могут также содержать запись RPATH. Чтобы проверить запись RPATH, запустите

readelf -d ffmpeg | grep RPATH

Вы, вероятно, не получите никакого результата от этого. Чтобы установить RPATH во время компиляции, выполните:

gcc ... -wl, -rpath=MY_PATH

Если вы хотите каталог выполнения, используйте \$Origin

Некоторые программы, такие как chrpath, позволяют редактировать RPATH существующего двоичного файла.

ПРИМЕЧАНИЕ. Любая программа, для которой задано значение setuid, не будет использовать LD_LIBRARY_PATH, поскольку это представляет угрозу безопасности.

7
KitsuneYMG

find / -name 'libavdevice.so.*' чтобы узнать, доступна ли эта библиотека.

Sudo gedit /etc/ld.so.conf

Добавьте эти строки и сохраните:

include /usr/local/lib
include /usr

ldconfig

7
vanloi999

Другой вариант для этого старого вопроса - использовать LD_RUN_PATH.

export LD_RUN_PATH=/usr/local/lib

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

make
make install
ldconfig

Лучше, чем использовать LD_LIBRARY_PATH. Оригинальная ссылка от @cweiske linuxmafia.com/faq/Admin/ld-lib-path.html

4
Tom