tl;dr: read the compile guide, and set a PREFIX and / or LD_LIBRARY_PATH
I did something I don’t normally do and compiled ffmpeg today, since the ffmpeg-user mailing list requires/strongly prefers/only supports current git head. I was doing this as I had some broken AVI files and wondered if they were salvageable:
Since it’s been a while since I’ve last compiled ffmpeg, I figured I’d grab a static build from John Van Sickle, but that was slightly out of date.
I then grabbed the ffmpeg sources, configure
‘d what I thought was sensible, but got: error while loading shared libraries: libavdevice.so.59: cannot open shared object file: No such file or directory
. My system libavdevice library was version 58. Hmm. I thought I had compiled statically, but:
./ffmpeg: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6b4340cce612e0ccba534da4100c363d4aa578ef, for GNU/Linux 4.4.0, not stripped
Hmm. Dynamically linked?
I must confess that I had gotten used to running the odd compiled binary ‘out of the box’* after a make
without further interaction; taking easy compilation for granted.
Building dynamic is easier in the long run; but I didn’t want to clobber the system, package-managed binaries or libraries. Fortunately that’s what the PREFIX
configure option makes possible, in particular: “PREFIX/lib: contains the generated libraries (e.g.libavutil,libavcodec,libavformatetc. in the case of FFmpeg)
“.
* It is still possible to run out of the box by telling ffmpeg where to find the libraries, by prefixing the command with LD_LIBRARY_PATH=/path/to/lib