GtkAdaでGUIってみる

GtkのAda用bindingであるGtkAdaを使ってGUI構築するメモ。

とりあえず、処理系はGNAT GPL Edition 2006を使う。他のAda05処理系のことはよく知らないが、GCCでも恐らく問題ないはずだ。

GtkAdaはAdaCoreのLibreサイトから無料で入手することが出来る。Win32用のファイルをDLすればインストーラが入っているので、それを実行すれば必要なファイルが所定の場所に展開される。

標準設定でインストールすればC:\GtkAda\share\examples\gtkada\tutorial\simple内にもっとも単純なサンプルがあるので、まずはこれを使用してコンパイルが正しく行われるかどうかを確認した。

開発環境としてはGNAT GPL Editionに入っているGPSを使いたいところである。が、少なくとも手元で5時間ほど実験した限りではGPSのグラフィカルな機能ではLinkerにスイッチを渡すことが出来なかった。GtkAdaのソースファイル自体はPeoject Propertyの設定欄で読み込めるので、Makeも途中までは問題なく進むのだが、最後の最後でリンカ(ld)が「cannot find -lgtkada」と吐いて止まってしまう。gtkadaが要求されるのはgtk.ads内のpragma Linker_Options ("-lgtkada");によるものだと思われる。

GPSはAdaで書かれているアプリケーションとしては致命的に落ちやすいので、この際すっぱり諦めよう。Propertyをいじっるとどうも異常な動作が増えるし、ユーザが最初に触れるAdaで書かれたアプリケーションがこうだとテンションは急降下である。

さて、仕方がないのでProjectファイルを自分で書き換えて、リンカに必要なオプションを渡すことにする(もちろん、ソースコード側に書いても良い)。リンカへのオプションはProjectファイル内ならばLinkerパッケージ内のDefault_Switchesに渡すことが出来る。全てのファイルにスイッチを適応する場合は引数にAdaを指定すればよい。

project Ui is

   for Source_Dirs use (".", "..\/..\/gtkada\/include\/gtkada");
   for Object_Dir use "..\/build";
   for Main use ("simple.adb");

   package Linker is
      for Default_Switches ("Ada")
          use ("-LC:\GtkAda\include\gtkada",  "-mwindows");
   end Linker;

end Ui;

リンカーオプションには、セットで-mwindowsを付けておこう。こうしないとGUIアプリケーションにもかかわらず、DOS窓が表れてしまう。

さて、ここまでくれば後はgnatmakeを呼び出すだけである。Projectファイル名を-Pで与えれば、細かい設定をコマンドラインに書かなくてすむので便利である。

C:\GPS_PROJECT\ui>gnatmake -PC:\GPS_PROJECT\ui\ui.gpr -d

恐らく、うまい具合にコンパイルが完了すると思われるが、生成された実行ファイルを実行するとエラーが出る。どうもDLLがおかしいらしい。

検索してみたところ、どうもGNAT GPLが使用するDLLのバージョンが古いらしく、GtkAdaが必要とする内容がサポートされていないらしい。C:\GtkAda\bin内のDLLファイルを全てC:\GNAT\GPL_2006\binにコピーし、再度コンパイルすると解決した。同じところからDLしたはずなのに、同期が取れていないとは少し間抜けな話である。

以上の行程で、とりあえずは、ただのウィンドウを表示することが出来るはずだ。