Meu objetivo é criar um único binário FFmpeg estático com suporte a libfdkaac e x264 para OSX e Linux. Primeiro, tentei criar um no OSX, sigo as instruções na web do FFmpeg: https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX
Aqui estão as definições de configuração que apliquei para criar um binário 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
Após o processo de compilação, o FFmpeg fica em torno de 14Mb, o que significa que não inclui as bibliotecas de terceiros. De fato, ele requer um link para bibliotecas dinâmicas localizadas em /usr/local/lib
. Se eu removi essas bibliotecas dinâmicas, o FFmpeg mostrará um erro 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
É o caminho certo para transformar todas as bibliotecas externas em um único binário estático?
Eu ficaria muito grato por sua ajuda!
ldd
comando para mostrar as dependências da biblioteca dinâmica de um binário? Ou apenas umfile
comando com saída que inclui se um binário estava vinculado estaticamente ou dinamicamente?--disable-shared --enable-static
deve criar um binário estático. Eu acho que faz no Linux, ou quando a compilação cruzada para o Windows. Então parece que um bug nos scripts ffmpeg construir sobre OS X--enable-static
não faz binários estáticos. Isso torna aslibav*
bibliotecas criadas pelo ffmpeg (e usadas pelos binários) estáticas ou não. Não faz o ffmpeg usar versões estáticas de bibliotecas externas. Então, o que você está vendo é o comportamento padrão do ffmpeg.Respostas:
No meu CentOS 5.11 e FFmpeg 3.0, tenho que usar opções
--enable-static diz ao complier para criar as "bibliotecas estáticas" (libav * .a). Podemos combinar a API FFmpeg no outro aplicativo autônomo (estático).
--disable-shared diz ao complier para não criar as "bibliotecas de objetos compartilhados vinculadas dinamicamente" (libav * .so). Esse tipo de biblioteca pode ser carregado e usar a API FFmpeg pelo outro aplicativo.
Essas 2 opções não cumprem o FFmpeg como executável estático independente.
fonte
Obrigado pela sugestão do stib. Deixo minha resposta aqui.
O processo de criação do FFmepg tem maior prioridade para usar a biblioteca dinâmica, mesmo se as bibliotecas estáticas estiverem prontas. Portanto, removi primeiro o suporte de algumas bibliotecas externas da configuração de compilação e verifique se todas as bibliotecas externas são apenas estáticas (remova * .dylib do prefixo / usr / local / lib). Em seguida, reconstrua-o com o seguinte comando:
Lembre-se de definir
--pkg-config-flags="--static"
, pedindo ao processo de compilação para usar a biblioteca estática. Então, obteremos um único binário FFmpeg executável!PS: Eu removi o suporte ao libass da configuração, porque o libass depende do Fontconfig lib, que só tenho biblioteca dinâmica disponível. Vou colocar o suporte à libass de volta assim que descobrir como criar uma biblioteca estática do fontconfig.
Obrigado.
fonte