2012年03月21日

MinGW/MSYS+gccでGUIアプリ開発環境を構築

Windows環境にMinGW/MSYSを入れて、Windows/Linux両方で実行できるGUIアプリを開発するための開発環境を構築してみた。

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を単独で実行できることが分かるはずである。

posted by 寄り道退屈男 at 14:01 | Comment(0) | TrackBack(0) | MinGW