I'm trying to compile bmdtools with a custom built version of libav 11 which I compiled under ~/libav-11.8/build using g++ 4.8.4 under Ubuntu 14.04. bmd uses pkg-config to build g++ flags, and since compilation fails on the linking phase, I tested pkg-config output as follows:

echo `pkg-config --cflags --libs libavcodec libavformat libswscale libavutil`

which yelds

-I/usr/local/include -pthread -L/usr/local/lib -lavformat -lavcodec
-ldl -lasound -lz -lwscale -lavutil -lm

So I figured -I and -L flags where not set to the custom build location. Setting PKG_CONFIG_PATH=~/libav-11.8/build/lib/pkgconfig and running it again yelded

-Ibuild/include -pthread -Lbuild/lib ...<lib flags>

which would be correct if I ran g++ from the build root folder. Shouldn't pkg-config resolve to an absolute path instead of a relative one? What is the rationale behind this behaviour?

  • Presumably it's reading pkg-config files under ~/libav-11.8/build/lib/pkgconfig; look for files with a .pc extension — what do they contain? I'm guessing you'll find the relative paths in there... – Stephen Kitt Oct 19 '16 at 16:42
  • I did find those, but they use prefix variable, which is set to build, in the Libs and Cflags section. That way it cannot be used to compile dependent libs which are not in the same root folder. – Grasshopper Oct 19 '16 at 16:59

After reading Freedesktop Guide to pkg-config I realized pkg-config does nothing to validate whether binaries, libraries or paths are accurate. It only spits out what is written in the Libs and Cflags of the .pc files.

In my case those are created by libav's compilation process and use the prefix variable passed to configure.

So after recompiling libav with prefix set to an absolute path, pkg-config will output -I and -L flags appropriate for use in the compilation of other projects.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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