2008年7月8日火曜日

pkg-configについて

gtkを弄ってみるネタの続き

Ubuntuではgtkの開発ライブラリがlibgtk2.0-devというパッケージ名になっている。libgtk2.0-docも一緒にインストールしておいた。

ところが、サンプルプログラムをコンパイルしようとしてちょっとつまづいた。
GUIを作るのはJavaくらいしかやったことが無かったわ俺。

gccでコンパイルしようとしてもヘッダファイルが読み込めない云々なエラーが出てしまった。
サンプルプログラムについてたMakefileの中身を見ると、pkg-configとか使っているのがわかる。
(何故素直にmakeを使わないのかというツッコミは無しで。事細かに手順が知りたいのよ。)

以下、pkg-configについて調べたりした覚書。

・pkg-config
gtkプログラムのソースでは『#include 』という具合でgtkのヘッダファイルをインクルードしているが、実際のgtk.hは/usr/include/gtk-2.0/gtk/gtk.hというパスだったりするし、さらにはgtk.hから他の多くのライブラリを読み込むので、gccでのコンパイル時に-I/usr/include/gtk-2.0……などなど多くのオプションを付けなければならない。
pkg-configはこれらの面倒なオプション文字列を自動生成してくれるというにくいヤツ。

例えば、gtkのVer.2のプログラムをコンパイルするのに必要なgccのオプション文字列を生成するには次の様にする。
$ pkg-config --cflags gtk+-2.0 --libs
これの出力結果は、
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0
となる。
実際には、
$ gcc GTK_SOURCE.c `pkg-config --cflags gtk+-2.0 --libs`
と、バッククウォートで括ってgccの末尾につけて使う。
上記のコマンドが実際には次の様に置き換わるわけだ。
$ gcc GTK_SOURCE.c -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0

もちろん、pkg-configの--cflagsオプションに指定できるものはgtkライブラリだけではない。次のコマンドでpkg-configが扱える(gccのオプションを生成できる)ライブラリの一覧が表示できる。
$ pkg-config --list-all
--libsオプションは、--cflagsについてのリンカのオプションを生成する。--libs-only-l gtk+-2.0としてもよい。二つのオプションの差異については省略。

bashでのバッククウォートに関して、一応覚書程度に書いておく。
$ echo `expr 1 + 2`
これは、exprの計算結果の出力を受けて次の様に置き換わり、
$ echo 3
結果は3と表示される。
(あんまりいい例じゃないなぁ。)

結局今日はgtkの中身について触れられなかった orz

0 件のコメント: