Mein Ziel ist es, eine einzelne statische FFmpeg-Binärdatei mit libfdkaac- und x264-Unterstützung für OSX und Linux zu erstellen. Zuerst habe ich versucht, eine unter OSX zu erstellen. Ich folge den Anweisungen im FFmpeg-Web: https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX
Hier sind die Konfigurationseinstellungen, die ich angewendet habe, um eine statische Binärdatei zu erstellen:
./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
Nach dem Erstellungsprozess beträgt FFmpeg etwa 14 MB, was bedeutet, dass die Bibliotheken von Drittanbietern nicht enthalten sind. Tatsächlich muss eine Verknüpfung zu dynamischen Bibliotheken hergestellt werden, die sich unter befinden /usr/local/lib
. Wenn ich diese dynamischen Bibliotheken entfernt habe, zeigt das FFmpeg einen Fehler wie:
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
Ist es der richtige Weg, alle externen Bibliotheken zu einer einzigen statischen Binärdatei zu machen?
Ich würde mich sehr über Ihre Hilfe freuen!
ldd
Befehl, die dynamischen Bibliotheksabhängigkeiten einer Binärdatei anzuzeigen? Oder nur einfile
Befehl mit Ausgabe, der enthält, ob eine Binärdatei statisch oder dynamisch verknüpft wurde?--disable-shared --enable-static
eine statische Binärdatei erstellen. Ich denke, es funktioniert unter Linux oder beim Cross-Compilieren für Windows. Es klingt also wie ein Fehler in den ffmpeg-Build-Skripten unter OS X--enable-static
keine statischen Binärdateien erstellt. Es macht dielibav*
von ffmpeg gebaut Bibliotheken (und durch die verwendeten Binärdateien) statisch oder nicht. Ffmpeg verwendet keine statischen Versionen externer Bibliotheken. Was Sie also sehen, ist das Standardverhalten für ffmpeg.Antworten:
In meinem CentOS 5.11 und FFmpeg 3.0 muss ich Optionen verwenden
--enable-static weist einen Complier an, die "statischen Bibliotheken" (libav * .a) zu erstellen. Wir können die FFmpeg-API in der anderen eigenständigen (statischen) Anwendung kombinieren.
--disable-shared weist einen Complier an, die "dynamisch verknüpften gemeinsam genutzten Objektbibliotheken" (libav * .so) nicht zu erstellen. Diese Arten von Bibliotheken können von der anderen Anwendung geladen und die FFmpeg-API verwendet werden.
Diese beiden Optionen erfüllen FFmpeg nicht als eigenständige statische ausführbare Datei.
quelle
Danke für den Vorschlag von stib. Ich lasse meine Antwort hier.
Der FFmepg-Erstellungsprozess hat eine höhere Priorität für die Verwendung der dynamischen Bibliothek, selbst wenn statische Bibliotheken bereit sind. Daher habe ich zuerst einige externe Bibliotheken aus der Build-Konfiguration entfernt und sichergestellt, dass alle externen Bibliotheken nur statisch sind (entfernen Sie * .dylib aus dem Präfix / usr / local / lib). Erstellen Sie es dann mit dem folgenden Befehl neu:
Denken Sie daran
--pkg-config-flags="--static"
, den Erstellungsprozess zu definieren und ihn zu bitten, die statische Bibliothek zu verwenden. Dann erhalten wir eine einzelne ausführbare FFmpeg-Binärdatei!PS: Ich habe die libass- Unterstützung aus der Konfiguration entfernt, da libass von der Fontconfig-Bibliothek abhängt, für die nur eine dynamische Bibliothek verfügbar ist. Ich werde die libass-Unterstützung zurücksetzen, sobald ich herausgefunden habe, wie eine statische Bibliothek von fontconfig erstellt wird.
Vielen Dank.
quelle