2012-09-25 30 views
7

Costruisco ffmpeg con librtmp. Il mio librtmp è in/opt/librtmp/lib. Quando eseguo l'ffmpeg, ha detto:Come aggiungere il percorso di ricerca della libreria condivisa a un file eseguibile?

./ffmpeg: error while loading shared libraries: librtmp.so.0: cannot open shared object file: No such file or directory 

lo uso ldd comando visualizza non trovato:

[[email protected] bin]# ldd ffmpeg 
     linux-vdso.so.1 => (0x00007fff15576000) 
     librtmp.so.0 => not found 
     libz.so.1 => /lib64/libz.so.1 (0x00002b9a71e10000) 
     libm.so.6 => /lib64/libm.so.6 (0x00002b9a72025000) 
     libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b9a722a8000) 
     libc.so.6 => /lib64/libc.so.6 (0x00002b9a724c3000) 
     /lib64/ld-linux-x86-64.so.2 (0x00002b9a71bf2000) 

so che il mio modo a:

[[email protected] bin]# ls -alh /opt/librtmp/lib/ 
total 300K 
drwxr-xr-x 3 root root 4.0K Sep 25 17:10 . 
drwxr-xr-x 7 root root 4.0K Sep 25 17:10 .. 
-rw-r--r-- 1 root root 158K Sep 25 17:10 librtmp.a 
lrwxrwxrwx 1 root root 12 Sep 25 17:10 librtmp.so -> librtmp.so.0 
-rwxr-xr-x 1 root root 118K Sep 25 17:10 librtmp.so.0 
drwxr-xr-x 2 root root 4.0K Sep 25 17:10 pkgconfig 

ho trovato diversi modi per risolvere il problema

  • modificare /etc/ld.so.conf, ma richiesto un utente cena
  • set variabile LD_LIBRARY_PATH, ma non è conventient agli utenti
  • passaggio rpath a gcc, come questo

configurazione args per il mio ffmpeg

PKG_CONFIG_PATH="/opt/librtmp/lib/pkgconfig" ./configure --disable-doc \ 
--disable-ffserver --disable-avdevice \ 
--disable-postproc --disable-avfilter --disable-bsfs \ 
--disable-filters \ 
--disable-asm \ 
--disable-bzlib \ 
--enable-librtmp \ 
--prefix=/opt/ffmpeg \ 
--extra-ldflags="-Wl,-rpath,/opt/librtmp/lib" 

Assumiamo non ci sono codice sorgente per ricompilare? Come si aggiunge il percorso di ricerca della libreria condivisa a un file eseguibile?

+0

Ho fatto un collegamento simbolico di /usr/lib/i486-linux-gnu/librtmp.so in/usr/local/lib e ffmpeg funziona come un incantesimo ... – Ice

risposta

3

È possibile utilizzare addrpath per aggiungere un RPATH al file elfo.

RPATH funziona come LD_LIBRARY_PATH, vale a dire che il caricatore dinamico cerca le librerie condivise in quel percorso. RPATH sarà permanentemente nel tuo file ELF.

+1

Il link nella risposta è morto - * quatramaran.ens. Non è stato possibile trovare l'indirizzo IP del server di fr *. – Pang

1

La mia correzione a questo problema è installare librtmp in/usr/local/lib ed eseguire 'sudo ldconfig' dopo averlo installato. Ffmpeg può quindi essere configurato semplicemente aggiungendo --enable-librtmp. Per me funziona bene: non sono necessarie modifiche al sistema!

3

Mi rendo conto che l'OP è probabilmente passato ma questo è il tipo di cose che NixOS fa regolarmente e hanno rilasciato uno strumento per questo stesso problema. Anche questo era un problema che avevo prima di sentire NixOS.

Ecco un esempio di utilizzo del loro strumento patchelf

... Allo stesso modo, è possibile modificare il RPATH, il percorso di ricerca linker incorporato in eseguibili e le librerie dinamiche:

patchelf --set-rpath /opt/my-libs/lib:/foo/lib program 

Questo fa sì che la dinamica linker per cercare in /opt/my-libs/lib e /foo/lib per le librerie condivise richieste dal programma ....

Da https://nixos.org/patchelf.html

1

nixos

questo potrebbe essere nixos specifici ma fornisce uno spaccato interessante su ldd/patchelf:

https://lastlog.de/blog/posts/playing_FTL_on_NIXOS.html

ubuntu

su Ubuntu/Fedora useresti: LD_LIBRARY_PATH con uno script di avviamento ./ftl, ancora una volta, vedere il mio post precedente su FTL e come viene distribuito.