Is /usr/local/lib searched for shared libraries?

匿名 (未验证) 提交于 2019-12-03 01:27:01

问题:

Is /usr/local/lib searched for shared libraries ? I have this error:

[[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:

Make sure your LD_LIBRARY_PATH is set up to include all directories you want to search and then test it again.

You can test this quickly with:

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

which will set it only for that invocation.

Alternatively, you can edit /etc/ld.so.conf which contains the default directories searched. Some Linux distributions may not include /usr/local/lib in that file.

Note that you may also need to update the cache /etc/ld.so.cache by running ldconfig (as root, or with sudo).



回答2:

Yes and no

Programs have a compiled-in (ok, "linked-in") idea of where their libraries are to be found. If a program is expecting to find its lib in /usr/local/lib then it will.

There is also a program called ldconfig and a configuration file called /etc/ld.so.conf and most likely an /etc/ld.so.conf.d, and these are used to specify site-specific directories.

Read "man ld.so" which lists other knobs like the environment variable 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. . . . 

...and...

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:

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

The GNU standards recommend installing by default all libraries in /usr/local/lib when distributing source code (and all commands should go into /usr/local/bin).

...

The list of directories to be searched is stored in the file /etc/ld.so.conf. Many Red Hat-derived distributions don't normally include /usr/local/lib in the file /etc/ld.so.conf. I consider this a bug, and adding /usr/local/lib to /etc/ld.so.conf is a common ``fix'' required to run many programs on Red Hat-derived systems.

On Debian /etc/ld.so.conf contains include /etc/ld.so.conf.d/*.conf, and /etc/ld.so.conf.d/libc.conf contains

# libc default configuration /usr/local/lib 


回答4:

IIRC, ld.so uses the file /etc/ld.so.conf to list the directories to search for shared objects. You may also use the environment variable LD_LIBRARY_PATH.

ELF headers on linux may also contain an RPATH entry. To check the RPATH entry run

readelf -d ffmpeg | grep RPATH 

You will probably not get any result from this. To set the RPATH while compiling do:

gcc ... -wl, -rpath=MY_PATH 

If you want the execution directory use \$ORIGIN

Some programs, such as chrpath, allow you to edit the RPATH of an existing binary.

NOTE: Any program that is setuid will not use LD_LIBRARY_PATH as it is a security risk.



回答5:

find / -name 'libavdevice.so.*' to find out whether this library is available.

sudo gedit /etc/ld.so.conf

Add these lines and save:

include /usr/local/lib include /usr 

ldconfig



回答6:

Another option for this old question is to use LD_RUN_PATH.

export LD_RUN_PATH=/usr/local/lib 

Then compile again:

make make install ldconfig 

Better than using LD_LIBRARY_PATH. Original reference from @cweiske linuxmafia.com/faq/Admin/ld-lib-path.html



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!