В / usr / local / lib выполняется поиск общих библиотек? - PullRequest
52 голосов
/ 20 января 2011

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

[Leo@chessman ~]$ whereis ffmpeg
ffmpeg: /usr/local/bin/ffmpeg
[Leo@chessman ~]$ ffmpeg
ffmpeg: error while loading shared libraries: libavcore.so.0: cannot open shared object file: No such file or directory
[Leo@chessman ~]$ 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
[Leo@chessman ~]$ 

Ответы [ 6 ]

66 голосов
/ 20 января 2011

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

12 голосов
/ 15 июля 2013

С 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 голосов
/ 20 января 2011

Да и нет

Программы имеют скомпилированное (хорошо, «связанное») представление о том, где находятся их библиотеки. Если программа ожидает найти свою библиотеку в /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.
. . .
7 голосов
/ 08 июля 2012

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

sudo gedit /etc/ld.so.conf

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

include /usr/local/lib
include /usr

ldconfig

7 голосов
/ 20 января 2011

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

4 голосов
/ 16 мая 2013

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

...