Est /usr/local/lib
recherché des bibliothèques partagées? J'ai cette erreur:
[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 ~]$
Assurez-vous que votre LD_LIBRARY_PATH
est configuré pour inclure tous les répertoires que vous souhaitez rechercher, puis le tester à nouveau.
Vous pouvez tester cela rapidement avec:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib ffmpeg
qui le définira uniquement pour cette invocation.
Vous pouvez également modifier /etc/ld.so.conf
qui contient les répertoires par défaut recherchés. Certaines distributions Linux peuvent ne pas inclure /usr/local/lib
dans ce fichier.
Notez que vous devrez peut-être également mettre à jour le cache /etc/ld.so.cache
en exécutant ldconfig
(en tant que root, ou avec Sudo
).
Les programmes ont une idée compilée (ok, "liée") de l'endroit où se trouvent leurs bibliothèques. Si un programme s'attend à trouver sa bibliothèque dans /usr/local/lib
alors ce sera le cas.
Il existe également un programme appelé ldconfig
et un fichier de configuration appelé /etc/ld.so.conf
et probablement un /etc/ld.so.conf.d
, et ceux-ci sont utilisés pour spécifier des répertoires spécifiques au site.
Lisez "man ld.so" qui répertorie d'autres boutons comme la variable d'environnement 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.
. . .
...et...
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.
. . .
De http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html :
Les normes GNU recommandent d'installer par défaut toutes les bibliothèques dans/usr/local/lib lors de la distribution du code source (et toutes les commandes doivent aller dans/usr/local/bin).
...
La liste des répertoires à rechercher est stockée dans le fichier /etc/ld.so.conf. De nombreuses distributions dérivées de Red Hat n'incluent normalement pas/usr/local/lib dans le fichier /etc/ld.so.conf. Je considère cela comme un bogue, et l'ajout de/usr/local/lib à /etc/ld.so.conf est un `` correctif '' commun requis pour exécuter de nombreux programmes sur des systèmes dérivés de Red Hat.
Sur Debian /etc/ld.so.conf
contient include /etc/ld.so.conf.d/*.conf
, et /etc/ld.so.conf.d/libc.conf
contient
# libc default configuration
/usr/local/lib
IIRC, ld.so utilise le fichier /etc/ld.so.conf pour répertorier les répertoires pour rechercher des objets partagés. Vous pouvez également utiliser la variable d'environnement LD_LIBRARY_PATH
.
Les en-têtes ELF sur linux peuvent également contenir une entrée RPATH. Pour vérifier l'exécution de l'entrée RPATH
readelf -d ffmpeg | grep RPATH
Vous n'en obtiendrez probablement aucun résultat. Pour définir le RPATH lors de la compilation, procédez comme suit:
gcc ... -wl, -rpath=MY_PATH
Si vous voulez que le répertoire d'exécution utilise \$Origin
Certains programmes, tels que chrpath, vous permettent d'éditer le RPATH d'un binaire existant.
REMARQUE: Tout programme qui est setuid n'utilisera pas LD_LIBRARY_PATH
car il s'agit d'un risque pour la sécurité.
find / -name 'libavdevice.so.*'
pour savoir si cette bibliothèque est disponible.
Sudo gedit /etc/ld.so.conf
Ajoutez ces lignes et enregistrez:
include /usr/local/lib
include /usr
ldconfig
Une autre option pour cette ancienne question consiste à utiliser LD_RUN_PATH.
export LD_RUN_PATH=/usr/local/lib
Compilez ensuite à nouveau:
make
make install
ldconfig
Mieux que d'utiliser LD_LIBRARY_PATH. Référence originale de @cweiske linuxmafia.com/faq/Admin/ld-lib-path.html