Pkg-config

pkg-configとは、ライブラリを利用する際に必要となる各種フラグやパス等を、共通したインターフェースで提供でするための手段である。
概要.
pkg-configは、環境変数PKG_CONFIG_PATHのパスに存在する *.pc ファイルに記録された情報を元に、ビルドの際に必要な文字列を返す。
例えば、libaaa.soを /usr/local/lib/aaa/ 以下に保存し、ヘッダファイルを /usr/local/include/aaa/ 以下にインストールした場合。
libaaa.so を利用したソースをコンパイルする際に、コンパイラへlibとincludeのパス等を指定する必要があるが、そのパスが環境ごとに異なる場合を考えると必ずしも gcc -I/usr/local/lib/include -o a.c -L/usr/local/lib/aaa -laaa が成立するとは限らない。
もしもlibaaa が aaa.pc を提供していれば、
 pkg-config aaa --cflags
で文字列 -I /usr/local/lib/aaa を得られ、
 pkg-config aaa --libs
で文字列 -L /usr/local/lib/aaa -laaa を得られるかもしれない。
もしもlibaaaがpkg-configに対応していれば（インストール時に適切な aaa.pc が作成されるライブラリーであれば）、そのlibaaa利用の際には pkg-config を用いることができるので、記述に統一性を持たせられる。
 gcc `pkg-config aaa --cflags --libs` a.c
"*".pcは普通は/usr/lib/pkgconfig/以下に作成され、pkg-config が読みにいくデフォルトのパスもここだが、/usr/share/pkgconfigの場合もあるかもしれない。
--prefix=/usr/localとしてライブラリーをビルドした場合は /usr/local/lib/pkgconfig かもしれない。
"*".pcのパスを独自に指定したい場合は環境変数PKG_CONFIG_PATHに指定する。export PKG_CONFIG_PATH=/usr/lib/aaa/pkgconfig など。
"*".pcの記述方法は、単純にフラグに応じて出力する文字列が列挙されているだけである。
たとえばglibの.pcファイルである glib-2.0.pc の場合は、
 prefix=/usr
 libdir=${exec_prefix}/lib
 includedir=${prefix}/include
 glib_genmarshal=glib-genmarshal
 gobject_query=gobject-query
 glib_mkenums=glib-mkenums
 Name: GLib
 Description: C Utility Library
 Version: 2.30.2
 Libs: -L${libdir} -lglib-2.0 
 Libs.private: -lrt
 Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include 
もしも pkg-config を使わずに、直接コンパイルフラグを指定するとしたら
glib_test.c
 #include <glib.h>
 main() {
 g_printf("hello");
 gcc -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -L/us/glib-2.0 -lglib-2.0 glib_test.c 
と、glibを利用するためのパスやフラグの記述が煩わしい。しかもこのパスはユーザーごとに異なる可能性もあるので、glib利用者がMakefile等に決め打ちしてもうまくいかない場合も考えられる。
一方、pkg-config を使えば
 gcc $(pkg-config --cflags --libs glib-2.0) glib_test.c
と、シンプルかつ抽象的に記述できる。