/ usr / local / libsearch共享库吗?

/usr/local/libsearch共享库吗? 我有这个错误:

 [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 ~]$ 

确保您的LD_LIBRARY_PATH已设置为包含要search的所有目录,然后再次对其进行testing。

您可以快速testing:

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

这将只为该调用设置它。

或者,您可以编辑包含search的默认目录的/etc/ld.so.conf 。 某些Linux发行版可能不在该文件中包含/usr/local/lib

请注意,您可能还需要通过运行ldconfig (以root身份或使用sudo )来更新caching/etc/ld.so.cache

是和不是

程序有一个编译(确定,“链接”)的想法,他们的图书馆将被发现。 如果程序希望在/usr/local/libfind它的lib,那么它会。

还有一个名为ldconfig的程序和一个名为/etc/ld.so.conf的configuration文件,很可能是/etc/ld.so.conf.d ,它们用于指定特定于站点的目录。

阅读“man ld.so”,其中列出了其他旋钮,如环境variablesLD_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. . . . 

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

GNU标准build议在分发源代码时默认安装/ usr / local / lib中的所有库(所有命令都应该放到/ usr / local / bin中)。

要search的目录列表存储在文件/etc/ld.so.conf中。 许多Red Hat派生的发行版通常不在文件/etc/ld.so.conf中包含/ usr / local / lib。 我认为这是一个bug,在/etc/ld.so.conf中添加/ usr / local / lib是在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 

find / -name 'libavdevice.so.*'来找出这个库是否可用。

sudo gedit /etc/ld.so.conf

添加这些行并保存:

 include /usr/local/lib include /usr 

ldconfig

IIRC,ld.so使用文件/etc/ld.so.conf列出要search共享对象的目录。 您也可以使用环境variablesLD_LIBRARY_PATH

Linux上的ELF标题也可能包含一个RPATH条目。 检查RPATH入口运行

 readelf -d ffmpeg | grep RPATH 

你可能不会从中得到任何结果。 在编译时设置RPATH:

 gcc ... -wl, -rpath=MY_PATH 

如果你想执行目录使用\$ORIGIN

某些程序(如chrpath)允许您编辑现有二进制文件的RPATH。

注:任何setuid程序都不会使用LD_LIBRARY_PATH因为这是一个安全风险。

这个老问题的另一个select是使用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的原始参考