web-dev-qa-db-ja.com

/ usr / local / libは共有ライブラリを検索しますか?

/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 ~]$ 
52
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を使用して)Sudoを実行します。

68
paxdiablo

はいといいえ

プログラムには、ライブラリがどこにあるかについてのコンパイル済み(OK、「リンクイン」)のアイデアがあります。プログラムが/usr/local/libでlibを見つけることを期待している場合、プログラムはそうなります。

ldconfigと呼ばれるプログラムと/etc/ld.so.confと呼ばれる設定ファイル、そしておそらく/etc/ld.so.conf.dもあり、これらはサイト固有のディレクトリを指定するために使用されます。

環境変数LD_LIBRARY_PATHのような他のノブをリストする「man ld.so」を読んでください。

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派生ディストリビューションでは、通常、/ etc/ld.so.confファイルに/ usr/local/libが含まれていません。私はこれをバグと考えており、/ 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を使用することもできます。

LinuxのELFヘッダーには、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