¿Cómo compilar FFmpeg con libfdkaac en un solo binario estático? [cerrado]

9

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!

Ellis Shen
fuente
1
Finalmente lo resolví. La razón por la que las bibliotecas dinámicas aún están vinculadas es porque el proceso de compilación de ffmepg tiene mayor prioridad para usar la biblioteca dinámica. En realidad, construí bibliotecas dinámicas y estáticas en la carpeta de prefijos, y una vez que eliminé todos los archivos * .dylib de la carpeta de prefijos, el proceso de compilación tomó la biblioteca estática y construyó un solo binario con éxito.
Ellis Shen
Considere responder su propia pregunta a otras personas que tienen el mismo problema.
stib
¿OS X no tiene el lddcomando para mostrar las dependencias de la biblioteca dinámica de un binario? ¿O simplemente un filecomando con salida que incluye si un binario estaba vinculado estática o dinámicamente?
Peter Cordes
Además, sí --disable-shared --enable-staticdeberí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
Peter Cordes
Vaya, solo estaba actualizando mi propio FFmpeg (en GNU / Linux), y --enable-staticno crea binarios estáticos. Hace que las libav*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.
Peter Cordes

Respuestas:

4

En mi CentOS 5.11 y FFmpeg 3.0, tengo que usar opciones

--pkg-config-flags="--static"
--extra-cflags="-I$HOME/ffmpeg/include -static"
--extra-ldflags="-L$HOME/ffmpeg/lib -static"

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

Boontawee Inicio
fuente
9

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:

./configure --pkg-config-flags="--static" --libdir=/usr/local/lib --extra-version=ntd_20150128 --disable-shared --enable-static --enable-gpl --enable-pthreads --enable-nonfree  --enable-libass --enable-libfdk-aac  --enable-libmp3lame  --enable-libx264 --enable-filters --enable-runtime-cpudetect

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.

Ellis Shen
fuente
¿Entonces "--enable-static" no es necesario ?!
Dr.jacky
3
Creo que todavía se requiere habilitar-static
Ellis Shen
1
Omg, me has salvado la vida, estuve trabajando en este problema durante casi 2 semanas, rastreando la web para encontrar una solución. Y ya está. Gracias !
YoannM