web-dev-qa-db-fra.com

Est-ce que / usr / local / lib recherche des bibliothèques partagées?

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 ~]$ 
52
Leo Izen

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).

68
paxdiablo

Oui et non

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.
. . .
12
DigitalRoss

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
12
Boris Burkov

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é.

7
KitsuneYMG

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

7
vanloi999

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

4
Tom