linux - source - ffmpeg使用




/ usr/local/lib是否搜索了共享庫? (4)

是的,不是

程序有一個編譯(ok,“鏈接”)的想法,可以找到它們的庫。 如果程序期望在/usr/local/lib找到它的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.
. . .

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

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因為它存在安全風險。


來自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

確保LD_LIBRARY_PATH設置為包含要搜索的所有目錄,然後再次測試。

您可以使用以下命令快速測試:

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

這將僅為該調用設置它。

或者,您可以編輯包含搜索的默認目錄的/etc/ld.so.conf 。 某些Linux發行版可能不包含該文件中的/usr/local/lib

請注意,您可能還需要通過運行ldconfig (以root身份或使用sudo )來更新緩存/etc/ld.so.cache





shared-libraries