Domanda / Usr / local / lib ha cercato le librerie condivise?


È /usr/local/lib cercato per le librerie condivise? Ho questo errore:

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

44
2018-01-20 03:42


origine


risposte:


Assicurati il ​​tuo LD_LIBRARY_PATH è impostato per includere tutte le directory che vuoi cercare e poi testarlo di nuovo.

Puoi testare questo rapidamente con:

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

che lo imposterà solo per quell'invocazione.

In alternativa, puoi modificare /etc/ld.so.conf che contiene le directory di default ricercate. Alcune distribuzioni Linux potrebbero non includere /usr/local/lib in quel file.

Si noti che potrebbe essere necessario aggiornare la cache /etc/ld.so.cache correndo ldconfig (come root, o con sudo).


59
2018-01-20 03:46



sì e no

I programmi hanno un'idea compilata (ok, "linkata") su dove trovare le loro librerie. Se un programma si aspetta di trovare la sua lib in /usr/local/lib allora lo farà.

C'è anche un programma chiamato ldconfig e un file di configurazione chiamato /etc/ld.so.conf e molto probabilmente un /etc/ld.so.conf.de questi sono usati per specificare le directory specifiche del sito.

Leggi "man ld.so" che elenca le altre manopole come la variabile di ambiente 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.
. . .

...e...

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
2018-01-20 03:48



A partire dal http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html:

Gli standard GNU raccomandano di installare di default tutte le librerie in / usr / local / lib durante la distribuzione del codice sorgente (e tutti i comandi dovrebbero andare in / usr / local / bin).

...

L'elenco delle directory da cercare è memorizzato nel file /etc/ld.so.conf. Molte distribuzioni derivate da Red Hat normalmente non includono / usr / local / lib nel file /etc/ld.so.conf. Considero questo un bug, e l'aggiunta di / usr / local / lib a /etc/ld.so.conf è un comune `` fix '' richiesto per eseguire molti programmi su sistemi derivati ​​da Red Hat.

Su Debian /etc/ld.so.conf contiene include /etc/ld.so.conf.d/*.conf, e /etc/ld.so.conf.d/libc.conf contiene

# libc default configuration
/usr/local/lib

9
2017-07-15 12:07



IIRC, ld.so usa il file /etc/ld.so.conf per elencare le directory per cercare oggetti condivisi. Puoi anche usare la variabile d'ambiente LD_LIBRARY_PATH.

Le intestazioni ELF su linux possono contenere anche una voce RPATH. Per controllare la corsa alla voce RPATH

readelf -d ffmpeg | grep RPATH

Probabilmente non otterrai alcun risultato da questo. Per impostare il RPATH durante la compilazione fare:

gcc ... -wl, -rpath=MY_PATH

Se vuoi usare la directory di esecuzione \$ORIGIN

Alcuni programmi, come chrpath, ti permettono di modificare il RPATH di un binario esistente.

NOTA: qualsiasi programma impostato su setuid non verrà utilizzato LD_LIBRARY_PATH in quanto è un rischio per la sicurezza.


7
2018-01-20 03:52



find / -name 'libavdevice.so.*' per scoprire se questa libreria è disponibile.

sudo gedit /etc/ld.so.conf

Aggiungi queste righe e salva:

include /usr/local/lib
include /usr

ldconfig


7
2017-07-08 12:37



Un'altra opzione per questa vecchia domanda è usare LD_RUN_PATH.

export LD_RUN_PATH=/usr/local/lib

Quindi compilare di nuovo:

make
make install
ldconfig

Meglio dell'utilizzo di LD_LIBRARY_PATH. Riferimento originale da @cweiske linuxmafia.com/faq/Admin/ld-lib-path.html


4
2018-05-15 20:28