Mi objetivo es construir un solo binario FFmpeg estático con libfdkaac y soporte x264 para OSX y Linux. Primero, intenté construir uno en OSX, sigo las instrucciones en la web de FFmpeg: https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX
Aquí están los ajustes de configuración que apliqué para construir un binario estático:
./configure pkg_config='pkg-config --static' --prefix=/usr/local --extra-version=ntd_20150126 --disable-shared --enable-static --enable-gpl --enable-pthreads --enable-nonfree --enable-fontconfig --enable-libfreetype --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-filters --enable-runtime-cpudetect
Después del proceso de compilación, FFmpeg es de alrededor de 14Mb, lo que significa que no incluye las bibliotecas de terceros. De hecho, requiere un enlace a bibliotecas dinámicas ubicadas en /usr/local/lib
. Si eliminé esas bibliotecas dinámicas, el FFmpeg mostrará un error como:
dyld: Library not loaded: /usr/local/lib/libSDL-1.2.0.dylib
Referenced from: /usr/local/bin/ffmpeg
Reason: image not found
Trace/BPT trap: 5
¿Es la forma correcta de convertir todas las bibliotecas externas en un solo binario estático?
¡Realmente agradecería su ayuda!
ldd
comando para mostrar las dependencias de la biblioteca dinámica de un binario? ¿O simplemente unfile
comando con salida que incluye si un binario estaba vinculado estática o dinámicamente?--disable-shared --enable-static
debería hacer un binario estático. Creo que lo hace en Linux, o cuando se realiza una compilación cruzada para Windows. Entonces suena como un error en los scripts de compilación de ffmpeg en OS X--enable-static
no crea binarios estáticos. Hace que laslibav*
bibliotecas creadas por ffmpeg (y utilizadas por los binarios) sean estáticas o no. No hace que ffmpeg use versiones estáticas de bibliotecas externas. Entonces, lo que está viendo es el comportamiento estándar de ffmpeg.Respuestas:
En mi CentOS 5.11 y FFmpeg 3.0, tengo que usar opciones
--enable-static le dice a un compilador que cree las "bibliotecas estáticas" (libav * .a). Podemos combinar la API de FFmpeg en la otra aplicación independiente (estática).
--disable-shared le dice a un compilador que no cree las "bibliotecas de objetos compartidos vinculados dinámicamente" (libav * .so). Este tipo de bibliotecas se pueden cargar y usar la API de FFmpeg por la otra aplicación.
Estas 2 opciones no compilan FFmpeg como ejecutable estático independiente.
fuente
Gracias por la sugerencia de stib. Dejo mi respuesta aquí.
El proceso de compilación de FFmepg tiene mayor prioridad para usar la biblioteca dinámica, incluso si las bibliotecas estáticas están listas. Por lo tanto, primero eliminé el soporte de algunas bibliotecas externas de la configuración de compilación y me aseguré de que todas las bibliotecas externas sean solo estáticas (elimine * .dylib del prefijo / usr / local / lib). Luego reconstruirlo con el siguiente comando:
Recuerde definir
--pkg-config-flags="--static"
, pidiendo al proceso de construcción que use una biblioteca estática. ¡Entonces, obtendremos un solo binario FFmpeg ejecutable!PD: eliminé el soporte de libass de la configuración, porque libass depende de Fontconfig lib, que solo tengo una biblioteca dinámica disponible. Volveré a poner el soporte de libass una vez que descubrí cómo hacer una biblioteca estática de fontconfig.
Gracias.
fuente