Подтвердить что ты не робот

Является ли /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] ~]$ 
4b9b3361

Ответ 1

Убедитесь, что ваш 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).

Ответ 2

Да и нет

В программах есть скомпилированная (ok, "linked-in" ) идея, где их библиотеки будут найдены. Если программа ожидает найти ее lib в /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.
. . .

Ответ 3

Из 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

Ответ 4

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

sudo gedit /etc/ld.so.conf

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

include /usr/local/lib
include /usr

ldconfig

Ответ 5

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, поскольку это представляет угрозу безопасности.

Ответ 6

Другой вариант для этого старого вопроса - использовать 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