Is /usr/local/lib searched for shared libraries?
Solution 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
).
Solution 2
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
Solution 3
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.
. . .
Solution 4
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
Solution 5
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.
Leo Izen
Who am I? Leo Izen. Thebombzen. Sedna. A nerd. Mayep S Photochop.
Updated on July 05, 2022Comments
-
Leo Izen almost 2 years
Is
/usr/local/lib
searched for shared libraries ? I have this error:[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 ~]$
-
DocWiki almost 13 years@paxdiablo Excellent solution!
export LD_LIBRARY_PATH=/usr/local/lib/
I have just spent hours searching for this solution. Works fine on my Ubuntu 10.10 with X264 enabled. -
infoclogged over 5 yearsis it necessary to use the word include?
-
Randoragon over 3 years"include" is reserved for importing from files. On many distributions, the default content of
/etc/ld.so.conf
isinclude /etc/ld.so.conf.d/*.conf
, and if you look through the/etc/ld.so.conf.d/
directory you'll see text files listing actual library paths. Use "include" for files that list libraries, and direct paths like/usr/local/lib
without "include".