9

My target is to build a single static FFmpeg binary with libfdkaac and x264 support for OSX and Linux. First, I tried to build one on OSX, I follow the instruction on FFmpeg web: https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX

Here is the configuration settings I applied to build a static binary:

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

After build process, FFmpeg is around 14Mb, which means that it doesn't include the third party libraries. In fact, it requires to link to dynamic libraries located at /usr/local/lib. If I removed those dynamic libs, the FFmpeg will show an error like:

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

Is it the right way to make all external libraries into single static binary?

I would be really appreciate for your help!

  • 1
    I finally figured it out. The reason that dynamic libraries are still linked is because ffmepg build process take higher priority to use dynamic library. Actually I built both dynamic and static libraries in the prefix folder, and Once I removed all *.dylib files from prefix folder, the build process took static library and built single binary successfully. – Ellis Shen Jan 28 '15 at 20:30
  • Consider answering your own question for others who are having the same problem. – stib Jan 29 '15 at 0:40
  • Doesn't OS X have the ldd command, to show the dynamic library dependencies of a binary? Or just a file command with output that includes whether a binary was statically or dynamically linked? – Peter Cordes Feb 23 '15 at 6:21
  • Also, yes --disable-shared --enable-static should make a static binary. I think it does on Linux, or when cross-compiling for windows. So it sounds like a bug in the ffmpeg build scripts on OS X – Peter Cordes Feb 23 '15 at 6:22
  • Oops, was just updating my own FFmpeg (on GNU/Linux), and --enable-static doesn't make static binaries. It makes the libav* libraries built by ffmpeg (and used by the binaries) static or not. It doesn't make ffmpeg use static versions of external libraries. So what you're seeing is the standard behaviour for ffmpeg. – Peter Cordes Feb 23 '15 at 22:52
4

In my CentOS 5.11 and FFmpeg 3.0, I have to use options

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

--enable-static tell a complier to create the "static libraries" (libav*.a). We can be combine FFmpeg API in the other standalone (static) application.

--disable-shared tell a complier not to create the "dynamically linked shared object libraries" (libav*.so). These type of libraries can be load and use FFmpeg API by the other application.

These 2 options doesn't complie FFmpeg as standalone static executable.

| improve this answer | |
9

Thanks for stib's suggestion. I leave my answer here.

FFmepg build process take higher priority to use dynamic library even if static libraries are ready. Therefore, I first removed some external libraries support from build configuration and make sure all external libraries are only static (remove *.dylib from prefix /usr/local/lib). Then rebuild it with the following command:

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

Remember to define --pkg-config-flags="--static", asking build process to use static library. Then, we will get a single executable FFmpeg binary!

P.S.: I removed the libass support from the configuration, because libass depends on Fontconfig lib which I only have dynamic library available. I'll put the libass support back once I figured out how to make a static library of fontconfig.

Thanks.

| improve this answer | |
  • So "--enable-static" is not necessary?! – Dr.jacky Dec 5 '15 at 8:08
  • 3
    I think --enable-static is still required – Ellis Shen Dec 6 '15 at 4:12
  • 1
    Omg, you've saved my life, I was working on this issue for almost 2 weeks, crawling the web for a solution. And this is it. Thank you ! – Yoann Dec 6 '17 at 7:52

Not the answer you're looking for? Browse other questions tagged or ask your own question.