試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

C言語でGTK+ 2を扱う上での幾つかのメモ(第1回)

GTK+ 2(GObject関係含む)に関することの内、C言語に特有のことを扱う。第1回では主に準備段階についてを扱う。

ライブラリのパッケージなどについて

一般的に、(GTK+を含む)ライブラリを用いたプログラムをビルドする際に必要なファイルは、ライブラリを用いた*1プログラムを実行する際に必要なファイル(ランタイムライブラリの本体)に加えてヘッダファイルや(ビルド時における)パッケージ検出システムのpkgconfig(pkg-configコマンド)向けのファイル,リンク時に用いるライブラリファイルといったものが含まれ、開発パッケージと呼ばれることがある。
プログラムをビルドすることがない限りは開発パッケージのファイルは必要がないことから、(Gentoo Linuxのような例外を除く)多くのディストリにおいて、ライブラリはランタイムと開発パッケージに分かれており、開発パッケージはディストリによって「lib(64)[ライブラリ名]-devel」「lib[ライブラリ名]-dev」などの名前でディストリごとのパッケージ管理ツールでインストールすることができる。
GTK+ 2を用いたC言語のプログラムをビルドするためには、「lib(64)gtk+2.0_0-devel」「libgtk2.0-dev」などの名前のパッケージをインストールしておく必要がある。Vala言語を用いてGTK+アプリケーションを作成する場合も、内部的にはC言語GTK+アプリケーションを作成するのと同じなので、(Vala言語のコンパイラに加えて)同じ開発パッケージが必要となる。ただし、Valaコンパイラの本体のように、Vala言語のソースからC言語のソースファイルを生成したものを配布した場合、それはValaコンパイラがなくてもビルドできる。
なお、開発を行わずにGTK+ 2のランタイムのみが必要かつ未インストールという場合には単独でライブラリのパッケージ名を探して入れてもよいが、何らかのGTK+ 2アプリケーション(GIMPでもLeafpadでも好きなもの)をパッケージ管理ツールからインストールすれば自動的にインストールされる。

コンパイル/リンク時の指定

コンパイル時やリンク時に渡す必要のあるオプション指定はGTK+の開発パッケージに含まれるpkgconfig向けのファイル(多くは/usr/lib(64)/pkgconfig/gtk+-2.0.pc)に記述されており、コンパイル時のオプションは--cflags,リンク時のオプションは--libsオプションを付けてpkg-configコマンドを実行すると

(コンパイル時のオプションを出力)
$ pkg-config --cflags gtk+-2.0
-I/usr/include/gtk-2.0 -I/usr/lib64/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/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12
(リンク時のオプションを出力)
$ pkg-config --libs gtk+-2.0
-lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0

のような出力が得られる。内容は環境やバージョンによって異なることがあるので、これをコピペして使うことはしない。実際には、ソースファイルが1つだけのもの(小規模なサンプルコードなど)であれば

$ gcc ([オプション指定...]) $(pkg-config --cflags --libs gtk+-2.0) [ソースファイル].c -o [実行ファイル]

としてその出力を利用してコンパイルするか、ビルドシステムが自動的にpkgconfigによりパッケージをチェックすると同時にこのオプション指定をビルド段階で用いるようにする。GTK+アプリケーションの開発に対応する統合開発環境(IDE)を用いた場合にはビルドシステムが(後者の方法により)初期状態で設定されているため、特に指定を行ったりする必要はない。

(「C言語でGTK+ 2を扱う上での幾つかのメモ(第2回)」に続く)

関連記事:

*1:共有ライブラリに動的リンクする