pkg-config
開発元 | Tollef Fog Heen / freedesktop.org |
---|---|
最新版 |
0.29.2
/ 2017年3月20日 |
リポジトリ | |
対応OS | Unix-like |
ライセンス | GNU GPL |
公式サイト | http://pkg-config.freedesktop.org/ |
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 exec_prefix=${prefix} 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
と、シンプルかつ抽象的に記述できる。