pkg-configとは、ライブラリを利用する際に必要となる各種フラグやパス等を、共通したインターフェースで提供でするための手段である。

pkg-config
開発元 Tollef Fog Heen / freedesktop.org
最新版
0.29.2 / 2017年3月20日 (7年前) (2017-03-20)
リポジトリ ウィキデータを編集
対応OS Unix-like
ライセンス GNU GPL
公式サイト http://pkg-config.freedesktop.org/
テンプレートを表示

概要 編集

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

と、シンプルかつ抽象的に記述できる。

外部リンク 編集