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