2012-09-25 15 views
7

Construyo el ffmpeg con librtmp. Mi librtmp está en/opt/librtmp/lib. Cuando ejecuto el ffmpeg, que dijo:¿Cómo agregar una ruta de búsqueda de biblioteca compartida a un archivo ejecutable?

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

utilizo comando ldd muestra que no se encuentra:

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

Sé que mi manera en:

[[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 

he encontrado varios formas de solucionar el problema

  • modificar /etc/ld.so.conf, pero requiere un usuario de la cena
  • conjunto de variables LD_LIBRARY_PATH, pero no se cuenta con inmejorables posibilidades para los usuarios rpath
  • pase a gcc, como este

configure args para mi 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" 

Supongamos que hay ningún código fuente para volver a compilar? ¿Cómo se agrega la ruta de búsqueda de la biblioteca compartida a un archivo ejecutable?

+0

Hice un enlace simbólico de /usr/lib/i486-linux-gnu/librtmp.so en/usr/local/lib y ffmpeg funciona como un encanto ... – Ice

Respuesta

3

Puede usar addrpath para agregar un RPATH a su archivo elf.

El RPATH funcionará como LD_LIBRARY_PATH, es decir, indicará al cargador dinámico que busque las bibliotecas compartidas en esa ruta. RPATH estará permanentemente en su archivo ELF.

+1

El enlace en la respuesta está muerto - * quatramaran.ens. no se pudo encontrar la dirección IP del servidor fr *. – Pang

1

Mi solución a este problema es instalar librtmp en/usr/local/lib y ejecutar 'sudo ldconfig' después de instalarlo. Ffmpeg se puede configurar simplemente agregando --enable-librtmp. Para mí, esto funciona bien: ¡No es necesario modificar el sistema!

3

Me doy cuenta de que OP probablemente se ha movido, pero este es el tipo de cosas que NixOS hace regularmente y han lanzado una herramienta para este problema. También esto fue un problema que tuve antes de escuchar sobre NixOS.

He aquí un ejemplo de uso de su herramienta de patchelf

... Del mismo modo, se puede cambiar el rPath, la ruta de búsqueda enlazador incrustado en ejecutables y bibliotecas dinámicas:

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

Esto hace que la dinámica enlazador para buscar en /opt/my-libs/lib y /foo/lib para las bibliotecas compartidas que necesita el programa ....

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

1

NixOS

este podría ser NixOS específicos sino que proporciona una visión interesante sobre LDD/patchelf:

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

ubuntu

en Ubuntu/Fedora usarías: LD_LIBRARY_PATH con una secuencia de comandos de inicio ./ftl, una vez más, consulte mi publicación anterior sobre FTL y cómo se implementa.

Cuestiones relacionadas