GUIライブラリとしてGTK+を使う場合と、WindowsAPIを使う場合の2パターンがあるので両方のサンプルソースを載せておく。どちらを選ぶかは、ライセンスと個々人の好みの問題だ。
というわけでまずは基礎的な環境構築から。
MinGW/MSYSをインストール
MinGWインストーラ(mingw-get-inst-20111118.exe (591.9 kB))をダウンロードして、インストール。
minimalist GNU というだけあってインストール自体はあっさり終わる。
インストールが完了したら、 C:/MinGW/msys/1.0/msys.bat でシェルが起動することを確認しておく。
ターミナルソフトminttyをインストール
デフォルトのターミナルソフトはコピペができないなど、何かと使いにくいので、mintty を別途インストールする。
インストール方法は、こんな感じ。
$ mingw-get update
$ mingw-get install msys-mintty
インストールが終わったら、 mintty と打ち込んで実行する。
GTK+をインストール
Windowアプリを作るためのライブラリ、GTK+をダウンロードしてインストールする。
gtk+-bundle_2.24.10-20120208_win32.zipをダウンロード&展開後、MinGW直下に丸ごとコピー。
GTK+を使ったサンプル
以下はGTK+を使ったシンプルなWindowプログラム。
※日本語も使いたいのでソースコードは必ず UTF-8 で保存すること。
hellogtk.c
#include <gtk/gtk.h>
static void cb_button(GtkWidget *widget, gpointer data) {
g_print("Hello A World\n");
}
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *button;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "ハローワールド");
gtk_widget_set_size_request(window, 250, 80);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
button = gtk_button_new_with_label("ハローワールド");
gtk_container_add(GTK_CONTAINER(window), button);
g_signal_connect(G_OBJECT(window) ,
"destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(button) ,
"clicked", G_CALLBACK(cb_button), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Makefile
CC = gcc
PKG_CONFIG = /mingw/bin/pkg-config.exe
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
hellogtk.exe: hellogtk.o
$(CC) -o hellogtk.exe hellogtk.o $(LDFLAGS)
hellogtk.o: hellogtk.c
$(CC) $(CFLAGS) -c -o hellogtk.o hellogtk.c
※ which pkg-configコマンドでpkg-configがインストール済みであることを確認し、MakefileのPKG_CONFIGに正しくパスを設定すること。
上記のMakefileでコンパイルを実行。
$ make
コンパイルにより生成された hellogtk.exe はシェルから叩けば起動するはず。
しかし、このままではMinGW環境以外(つまりWindows環境)から起動しようとしても、「コンピューターに ○○.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。」と怒られて、起動に失敗する筈である。作ったexeが依存ライブラリを読み込めていないからだ。
そんな時は、C:/MinGW/bin 配下にある必要なライブラリ(○○.dll)を全て hellogtk.exe と同じ階層(つまりパスの通った場所)へコピる必要がある。そうすればダブルクリックして実行(Windowsから実行)することができるようになる。
ちなみに今回のexeが依存したライブラリは以下の通りである。このようなシンプルなアプリであっても依存ライブラリがとても多いのがお分かりだろう。
c:/mingw/bin/freetype6.dll
c:/mingw/bin/intl.dll
c:/mingw/bin/libatk-1.0-0.dll
c:/mingw/bin/libcairo-2.dll
c:/mingw/bin/libexpat-1.dll
c:/mingw/bin/libfontconfig-1.dll
c:/mingw/bin/libgdk-win32-2.0-0.dll
c:/mingw/bin/libgdk_pixbuf-2.0-0.dll
c:/mingw/bin/libgio-2.0-0.dll
c:/mingw/bin/libglib-2.0-0.dll
c:/mingw/bin/libgmodule-2.0-0.dll
c:/mingw/bin/libgobject-2.0-0.dll
c:/mingw/bin/libgthread-2.0-0.dll
c:/mingw/bin/libgtk-win32-2.0-0.dll
c:/mingw/bin/libpango-1.0-0.dll
c:/mingw/bin/libpangocairo-1.0-0.dll
c:/mingw/bin/libpangoft2-1.0-0.dll
c:/mingw/bin/libpangowin32-1.0-0.dll
c:/mingw/bin/libpng14-14.dll
c:/mingw/bin/zlib1.dll
GTK+を使わない(WinAPIを呼び出す)場合のサンプル
GTK+を使わずにWinAPIだけを使ったWindowアプリのサンプルも掲載しておこう。こちらの方法であれば面倒なライブラリの依存関係に悩まされることもない。
ライブラリに依存しないことを確認するためだけのアプリなので、ボタンも何もないダイアログだけの超シンプルなWindowsアプリである。
hellowinapi.c
#include <windows.h>
int WINAPI
WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nShowCmd)
{
MessageBoxW (NULL, L"ハローワールド!", L"ハロワ", MB_OK | MB_ICONINFORMATION);
return 0;
}
Makefile
CC = gcc
PKG_CONFIG = /mingw/bin/pkg-config.exe
CFLAGS = -Wall -DGTK_DISABLE_DEPRECATED -mms-bitfields `$(PKG_CONFIG) --cflags`
LDFLAGS = -mno-cygwin -Wl,--subsystem,windows
hellowinapi.exe: hellowinapi.o
$(CC) -o hellowinapi.exe hellowinapi.o $(LDFLAGS)
hellowinapi.o: hellowinapi.c
$(CC) $(CFLAGS) -c -o hellowinapi.o hellowinapi.c
後は上記をmakeして、生成されたhellowinapi.exeをダブルクリックで実行するだけ。特にこれといったライブラリがなくてもexeを単独で実行できることが分かるはずである。