Windowsネイティブなgtk2アプリケーションの開発

(2004.11.7 新規作成。)
(2005.7.16 MinGWを追加。)

Windowsネイティブなgtk2プログラムの作り方。前半はCygwinでのコンパイル方法を説明し、そのあとでMinGWでのコンパイル方法を紹介する。

gtk2の入手

Windows用のgtk2は、いくつかのWebサイトから入手できるが、モノによっては日本語のファイル名を扱えない(クラッシュしたりする)。次のところから入手できるものが優れている。

「Gtk+/Win32 Development Environment」というパッケージに、一通りのものが含まれている。このインストーラは、Cygwinの有無を判別して、ヘッダファイルなどもインストールしてくれる。

インストーラは、管理者権限のあるユーザーで実行すること。

インストール先は、cygwinで扱いやすいディレクトリ(フォルダ)にするといい。例えば、d:/cygwin/gtk など。

含まれるライブラリは、次のとおり。

iconv intl libart_lgpl_2 libatk-1.0 libbz2 libfontconfig libfreetype libgdk-win32-2.0 libgdk_pixbuf-2.0 libgdkglext-win32-1.0 libglade-2.0 libglib-2.0 libgmodule-2.0 libgobject-2.0 libgthread-2.0 libgtk-win32-2.0 libgtkglext-win32-1.0 libjpeg libpango-1.0 libpangoft2-1.0 libpangowin32-1.0 libpng libpopt libtiff libxml2 libz

簡単なサンプル

極めて簡単なサンプルプログラム。単にウィンドウを表示し、そこにボタンを表示する。このボタンをクリックすると、プログラムが終了する。

日本語のテキストを含んでいるので、このソースはUTF-8で記述する。

#include <gtk/gtk.h>
#include <stdlib.h>

void onHello(GtkWidget* widget, gpointer data) {
    g_print("はろーわーるど\n");
    exit(0);
}

int main(int argc, char* argv[]) {
    gtk_set_locale();
    gtk_init(&argc, &argv);

    GtkWidget* top = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    GtkWidget* button = gtk_button_new_with_label("hello はろーわーるど");
    g_signal_connect(GTK_OBJECT(button), "clicked",
                     GTK_SIGNAL_FUNC(onHello), NULL);
    gtk_container_add(GTK_CONTAINER(top), button);

    gtk_widget_show_all(top);
    gtk_main();

    return 0;
}

Makefile

Makefileは、少し気をつける必要がある。何も考えずに書くと、Cygwinのライブラリが使われ、実行するときにもCygwinが必要になる。

まず、コンパイルするときに、-mms-bitfields オプションを追加する。これがないと、出来上がったプログラムがクラッシュしたりする。

CFLAGS = -Wall -DGTK_DISABLE_DEPRECATED -mms-bitfields `$(PKG_CONFIG) --cflags gtk+-2.0`

リンク時には、-mno-cygwin オプションと -Wl,--subsystem,windows オプションが必要。前者はCygwinのライブラリを使わないようにするためのもので、後者はプログラムの実行時にコマンドプロンプトウィンドウを表示させないようにする。

LDFLAGS = -mno-cygwin `$(PKG_CONFIG) --libs gtk+-2.0` -Wl,--subsystem,windows

したがって、Makefileは次のようになる。pkg-configコマンドは、ネイティブ版gtk+に添付のものを使う。

CC = gcc
PKG_CONFIG = /gtk/bin/pkg-config

CFLAGS = -Wall -DGTK_DISABLE_DEPRECATED -mms-bitfields `$(PKG_CONFIG) --cflags gtk+-2.0`
LDFLAGS = -mno-cygwin `$(PKG_CONFIG) --libs gtk+-2.0` -Wl,--subsystem,windows

first.exe: first.o
	$(CC) -o first.exe first.o $(LDFLAGS) 

first.o: first.cc
	$(CC) $(CFLAGS) -c -o first.o first.cc 

実行結果

Windows XPで動かすと、次のようになる。

MinGWで開発する

(2005.7.16 この節追加。)

MinGWそのもののインストールは、MinGWのインストール を参照してください。

Gtk+/Win32 Development Environmentは、PATHなどの環境変数を自動的に設定する。MinGWでは、環境変数はWindowsのコントロールパネルで設定・確認する。[システム]の詳細設定タブ、環境変数ボタンを押すと表示される。

msysのウィンドウを開いて、pkg-configが使えるか確認しておく。

$ which pkg-config
/f/gtk-2.6/bin/pkg-config

MinGWでは、Cygwinと違い、コンパイルオプションとして-mno-cygwin や、-lWl,--subsystem,windows をつける必要はない。下記でコンパイル、リンクできる。

$ gcc -Wall -mms-bitfields <ソース名> `pkg-config --cflags --libs gtk+-2.0`