Windows版Gtk+による、ウィンドウアプリケーション開発環境の作り方

Gtk+ライブラリを使うと、ボタンとテキスト、簡単な図形などを表示するプログラムならば簡単に書くことができます。
実験やモックアップに、ちょっとしたウィンドウアプリケーションを作るのに便利です。
なんといってもありがたいのは、標準的なWin32アプリケーションではウィンドウを出すだけで120行のコードが必要であるのに対して、Gtkは20行で済むところです。

gtk作成した、何もしないウィンドウアプリケーション
Gtkで作成した、何もしないウィンドウアプリケーション


Gtkはクロスプラットフォームであることと、Win32APIより新しいためシンプルかつわかりやすいのが利点ですが、Windows環境でコンパイルするための情報が少ないという欠点を持っています。

そこで今回は、わたしなりに試行錯誤して確立した、Windows環境でのGtkアプリケーション開発環境についてまとめています。


追記:構築済み環境をgithubにて公開しています。

ファイルの取得

MinGWのインストール

今回はコンパイラにMinGW(gcc)を使用します。MinGWは、コマンドプロンプトから使うコンパイラです。
公式ページで「Download」という単語をたどっていけば、そのうちSourceforgeのダウンロードページへ出ます。ページの上のほうあたりに、最新版インストーラへのリンクがあります。
ちなみにこの記事を書いた時の最新版は「 Looking for the latest version? Download mingw-get-inst-20120426.exe (662.7 kB)」でした。
インストーラを起動すれば、あとは簡単です。ただし、インストール中はインターネットに接続している必要があります。

MinGWを環境変数に設定

通常、MinGWをインストールしたら、環境変数を設定して使いやすくしておくのが通例です。
Windowsボタンを押して「コンピュータ」(または「マイコンピュータ」)を右クリックし、「プロパティ(R)」から「システムの詳細設定」で、下にある「環境変数(N)」をクリック。

システム環境変数から「Path」を探して追記します。
既に書いてある内容は絶対に消さないで、 末尾に、
;C:\MinGW\bin\;
を書き足します。
(何をしているかというと、MinGWのインストール先を環境変数に登録しています。環境変数「Path」に登録されたディレクトリの下にあるファイルは、コマンドプロンプトでパスを省略して呼び出すことができるようになります。つまり、"gcc"の3文字だけでコンパイラが呼べるようになります。)


確認のために、コマンドプロンプトを開いて、gccと打ってエンターキーで実行してみましょう。
gcc: fatal error: no input filesなどと出力されたら成功です。今回は、コンパイルに必要なファイルが存在しないためgccがエラーを返しますが、つまりはgccを呼ぶことに成功しています。

Gtk+ for Windows ライブラリのダウンロード

公式配布ページはGoogle検索でもすぐ出てくるのですが、全文英語かつダウンロード可能なファイルが多く、どれを落とせばよいのか、一見して悩みます。
結論としては、本家のGTK公式サイトが、コンパイル済みですぐ使える全部入りのライブラリをzipで配布しているので、それを選びます。「all-in-one bundle 」というリンクの先にあります。
入手したzipの使い方については下で説明します。といっても、解凍して配置するだけで、ライブラリフォルダ自体には手を加えることはありません。


プロジェクトディレクトリとファイルの配置、コンパイル

開発環境を構築するにあたって、環境の作り方にいろいろな選択肢があるのですが、とりあえず一つに絞って解説します。
『環境変数のパス指定はプロジェクト内に完結・プロジェクト内にGtkライブラリファイルを内包・パス指定はすべて相対パス。』
これはプロジェクトの外に影響を与えることがなく、フォルダを移動してもコンパイル可能な形態です。(MinGW除く)

プロジェクトディレクトリの作成

空のディレクトリを作成して、ファイルを配置するだけです。

まず、空のディレクトリですが、C:ドライブの直下に作るのがオススメです。とはいえ、ホームディレクトリやデスクトップに作っても基本的には問題ありません。(というかそうなるように設定していきます。)
ディレクトリの名前も適当に付けます。hellogtkでいいです。

前段階でダウンロードしておいた、Gtk for Windowsのzipファイルを解凍します。
解答するとたぶんそのまま「gtk+-bundle_2.24.10-20120208_win32.zip」 という名前のディレクトリになると思いますので、これを「gtk」にリネームしておきます。(そのほうが楽だからです。)
このgtkフォルダを、hellogtkフォルダの下に入れます。
これだけで配置終了です。

これから、
開発用コマンドプロンプトを呼び出すためのバッチファイル「!cons.bat」
コンパイルテスト用に、Gtkウィンドウアプリケーションのソースファイル「hello_gtk.c」
を作成して配置します。

開発環境バッチファイル「!cons.bat」

コンパイルはコマンドプロンプトで行います。
また、Gtkアプリケーションをコンパイルするためには、環境変数を設定する必要があります。
MinGWのときのように、環境編集Pathを設定してもよいのですが、今回はバッチファイルを作成し、環境変数を設定済みのコマンドプロンプトを呼び出すこととします。

コマンドプロンプトを呼び出すバッチファイルを書く

メモ帳を開いて、以下の一行を記入します。
cmd.exe
以上です。 !cons.txtという名前で保存しておいてください。
(なお、この名前に理由はありません。何でもいいです。)

テキストファイルをバッチファイルに変える

といっても、ファイルの拡張子を変えるだけの簡単なお仕事なのですが。
ですが、実はここが一番の難所です。
というのも、Windows環境は、デフォルトで拡張子を変えられないからです。

というわけで、Windowsの設定を変えます。
適当なフォルダを開いて、Altキーを押すと、タスクバーが出ますので、その中の「ツール(T)」 から「フォルダーオプション(O)」を呼び出します。
「表示」タブの詳細設定から、「登録されている拡張子は表示しない」のチェックボックスを外して無効にします。
 上の「フォルダーに適用(L)」ボタンを押して、全フォルダに適応します。

この状態で、先ほど作った !cons.txt ファイルを見ると、たぶん、「!cons.txt」か 「!cons.txt.txt」あたりのファイル名になっており、拡張子.txtがしっかり表示されているはずです。

ファイルを右クリックして出てくる「名前の変更(M)」から拡張子を変更します。
バッチファイルにするには、ファイル名の末尾が".bat"になっている必要があります。
ファイル名を、
!cons.bat
に変えてください。

では !cons.bat ファイルをダブルクリックして実行してください。
コマンドプロンプトが立ち上がれば、ここまでは上手く行っています。

Gtkアプリをコンパイルできる環境変数を設定する

PATHを指定する必要があります。
SETコマンドを使えば、システムの環境変数を上書きする形で、そのコマンドプロンプトだけで有効な環境変数を設定することができます。
set PATH=gtk\bin\;%PATH%
コマンドライン上でそのまま入力して使えます。つまり、バッチファイルに書いて使えるということです。
なお、バッチファイルを編集するには、右クリックから「編集」を選択します。

書き足すと、バッチファイルの中身はこんな状態になっていると思います。(コメントを追記しておきました。 )

!cons.bat

    #gtkライブラリにパスを通す
    set PATH=gtk\bin\;%PATH%

    #コマンドプロンプトを呼び出す
    cmd.exe



バッチファイルをダブルクリックすればコマンドプロンプトが起動します。そのコマンドプロンプト上で、
gtk-demo
と打って実行し、gtkのウィンドウアプリケーションが起動すれば、バッチファイル作成は成功です。

gtk-demoを実行(コマンドラインから)
gtk-demoを実行(コマンドラインから)

Gtkのウィンドウアプリケーション「hellogtk.c」


以下の内容のテキストファイルを作成します。

hellogtk.c

#include <gtk/gtk.h>

int main (int argc, char **argv){
    
    /* 国際化(日本語対応のため) */
    gtk_set_locale();
    /* GTK+ の初期化 */
    gtk_init(&argc, &argv);
    
    /* メインウィンドウの作成 */
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request (window, 300, 200);
    
    /* 「ウィンドウを閉じる」コールバック */
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
    
    /* ウィジェットの表示 */
    gtk_widget_show_all(window);
    /* コールバックの受付開始 */
    gtk_main();
return 0;
}




ファイル名をhello_gtk.cに変えておいてください。
ファイルのリネーム方法は、 !cons.bat の時と同じように。

コンパイルの実行

コンパイルにはgccとpkg-configを使います。
そして、このふたつを結びつけるために、FORコマンドも使用します。

Gtkアプリケーションをコンパイルする際には、コンパイラに対してGtkを利用するためのオプションを指定しなければなりません。
幸いなことに、Gtkライブラリにはpkg-configというツールが付属しており、適切なパスとオプションをgcc用に出力してくれます。

実際の作業は以下の通り。

まず、pkg-configの出力するコンパイルオプションを、環境変数に格納します。(折り返していますが、実際は一行のコマンドです。 )
FOR /F "usebackq tokens=*" %A IN (`pkg-config --cfla gs --libs gtk+-2.0`) DO @SET GTKOPTS=%A

値が格納されていることを確認します。
echo %GTKOPTS%

実際にコンパイルを行います。echoの時と同じく、環境変数が展開されて、gccにpkg-configのオプションを渡すことができます。
gcc hellogtk.c %GTKOPTS%

a.exeというファイルができていたら成功です。
コマンドラインから呼び出してみましょう。
a.exe
上手く行っていれば、画像のような何もしないウィンドウが現れるはずです。
起動したa.exe (hellogtk.c)
起動したa.exe (hellogtk.c)

Gtkアプリケーションのコンパイルまでに必要な、最低限の設定と手順は以上です。
以下は、このあとのGtkアプリケーション開発で、必要になりそうな事項について書いておきます。


「makefile」の記述と使用

コマンドを手打ちしてコンパイルするのも良いですが、本来はmakefileを作るべきだと思います。
規模が大きくなったり、もう少し本格的なGtkアプリケーションの作成に移ると、makefileが必要になってきます。

makefileにはコマンド置換機能があるので、オプション指定などもコマンドラインより簡単に書けます。

ただし、makefileはタブが意味を持つ構文です。行の先頭が空文字であるところは、実際にはタブを挿入する必要がありますので注意してください。また、makefileのファイル名は makefile であり、必ず拡張子が付いていないことを確認してください。

makefileの内容は、下記の通りです。


makefile

obj=hellogtk
PKG_CONFIG=pkg-config

all: $(obj).exe

$(obj).exe: $(obj).c makefile
  gcc $(FLAGS) -o $(obj).exe $(obj).c \

    $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0)


run: $(obj).exe
  ./$(obj).exe
 

clean:
  rm $(obj).exe



また、バッチファイルにも手を加える必要があります。
バッチファイル !cons.bat にも、cmd.exeの前に4行を追記して以下のようにします。

!cons.bat

#gtkライブラリにパスを通す
set PATH=gtk\bin\;%PATH%

#makeを使いやすくする
doskey make = mingw32-make $*
#make cleanを使えるようにする
doskey rm = del $*


#コマンドプロンプトを呼び出す
cmd.exe



なぜこの記述を追加する必要があるかというと、MinGWに付属しているmakeは、ファイル名がmingw32-make.exeであり、そのままではmakeと打って使うことができないからです。
doskeyコマンドはコマンドプロンプト上で打った内容を実行前に置き換えてくれるので、makeと打てばmingw32-make.exeが起動するようになります。

というわけで、以上の通り、makefileを作って!cons.batに追記をすればOKです。
コンパイルと実行が、以下の一行を打つだけで終わります。
make run
と打つだけです。
上手く行けば、gtkアプリケーションが起動します。


その他雑記

自分でコンパイルしたGTKアプリケーションで、日本語が文字化けする場合、ソースコードの文字コードををUTF-8に変更すると解決する可能性があります。


本記事のGTKプログラムおよび開発環境(?)は、UbuntuなどのLinux環境でも問題なく動くはずです。
GTKはマルチプラットフォームですし、本記事のmakefileなどはクロスプラットフォームを意識して書いてあるためです。
(むしろLinux向けソースを!cons.batでWindows対応させた、と言えるくらい。)
Linuxで動かす場合の差異としては、
・GTKライブラリをパッケージマネージャから導入すること
・シェル起動バッチはLinuxでは使えないので、
 自分でターミナルを起動してチェンジディレクトリ(cd)すること
くらいです。


MinGWもプロジェクトに入れてしまえば、他のマシンに移動してもコンパイル可能です。
ただし、MinGWはファイル数が多いため、 総ファイルサイズに反してコピーに時間がかかります。
(それでもVisual Studioをインストールするよりは早いです。)
 その場合、!cons.batでGtkと一緒に環境変数PATHの設定をしてしまったほうが良いです。


Gtkは最新バージョンのGtk-3.0が登場していますが、配布されているWindows版ライブラリはGtk-2.0です。2.0と3.0には、互換性のない部分もあるそうです。


古いライブラリを独自に配布しているページなどもありますが、公式サイトの最新版を使いましょう。


echo %GTKOPTS%で表示されるコンパイルオプションは、わたしの環境では以下のようになります。自分で調べて手打ちしようとすると、気が遠くなります。
-mms-bitfields -ID:/work_programing/hellogtk/gtk/include/gtk-2.0 -ID:/work_progr
aming/hellogtk/gtk/lib/gtk-2.0/include -ID:/work_programing/hellogtk/gtk/include
/atk-1.0 -ID:/work_programing/hellogtk/gtk/include/cairo -ID:/work_programing/he
llogtk/gtk/include/gdk-pixbuf-2.0 -ID:/work_programing/hellogtk/gtk/include/pang
o-1.0 -ID:/work_programing/hellogtk/gtk/include/glib-2.0 -ID:/work_programing/he
llogtk/gtk/lib/glib-2.0/include -ID:/work_programing/hellogtk/gtk/include -ID:/w
ork_programing/hellogtk/gtk/include/freetype2 -ID:/work_programing/hellogtk/gtk/
include/libpng14  -LD:/work_programing/hellogtk/gtk/lib -lgtk-win32-2.0 -lgdk-wi
n32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixb
uf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0
-lintl

(注意:読むとわかるのですが、このままコピペして使うことはできません。パスがDドライブを指していたりしますので。)


 本当にどうでもいいことですが、「!cons.bat」は、初めてこのバッチファイルを見た「30日でできるOS自作入門」から来ていて、ファイル名も、そのまま使っているだけです。


Gtkをやっていたのはもうけっこう前のことで、思い出しながら書いたのですが、意外と覚えているものですね。

0 件のコメント:

コメントを投稿

Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換する

 Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換することができるが、上手く変換されない場合がある。   以前作った魔法陣イラスト素材をイラスト素材ストックサイトへ登録しようと思い立ち、改めて素材用にラスタライズ変換をかけようとした。   ラスタライズ変換...