2014年9月15日月曜日

gtkをWindowsでコンパイル

少々理由あってlinuxのGTKアプリをWindows で動くように変換した。
以下はその備忘録

Qtなら簡単にWindowsとLinuxでやりとりできるのを知ってたが、同じことを
GTKでできるかを調べるはめに追い込まれた。
そのアプリの名前はgerbv(http://sourceforge.jp/projects/sfnet_gerbv/
基板のガーバーデータ(RX-274X)を見るアプリだ。

これ自体はapt get source gerbvでソースがおとせるので割合簡単にmakeできる。
そしてそのソースを例えばeclipseに突っ込んでビルドするのも難しくない。
全部ソースを適当なeclipseのプロジェクトにぶち込んで、makeの引数から
-Iのインクルード、-Dのマクロ、link をそのままコピーしてeclipseに入れたらあっさりビルドできた。
あとちょっとソースはいじった。

でこれをWindowsで動かすにはどうすればいいのかだが、
まずVisual Studioで動かすのは難しいのでこれは早々と諦めた。

つぎにこのREADMEに
- Go to http://www.gtk.org and follow links to gtk for win32.

- Download all of the runtime, developer, and source .zip, .tar.gz, and
  .bz2  files for glib, atk, pango, gtk+, gettext, libiconv, pkg-config,
  and the others there.  Save all of these files to ~/gtk_win32_downloads.

- In cygwin,

  cd /path/to/gerbv/sources

  and run

  ./win32/extract_gtk_win32.
こうあるのでまじめにダウンロードしてやってみたがこれも難しいのか成功しない。

結局頼ったのがlinuxのeclipseでできたから、Windowsでもmingw+eclipse+CDTの環境があるから、これにGTKを付けられないか?ってことだがこれは成功する。
http://adeigjl.blogspot.jp/2011/06/gtk-helloworld.html
ここに詳しい。
まず注意することとしてGTKを最初にダウンロードするがWindows64bitの人は64bit版を
ダウンロードすること。しないとあとで謎のリンクエラーが起こってしばらく悩む
またGTK3でなくてGTK2なのにも注意 (これはアプリがGTK2を使うから)
32bit
http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip
64bit
http://ftp.gnome.org/pub/gnome/binaries/win64/gtk+/2.22/gtk+-bundle_2.22.1-20101229_win64.zip
で適当なところ
c:\opt\gtk
とかに解凍してc:\opt\gtk\binにパスを通す。

cmd.exeで
>pkg-config --cflags gtk+-2.0
>gtk-demo

でアプリが立ち上がったのを確認 
 
このあとはeclipseの作業
①適当なプロジェクトを作成
②ソースを書く
  http://developer.gnome.org/gtk-tutorial/stable/c39.html#SEC-HELLOWORLD
③ コマンドプロンプトにて以下を実行
>pkg-config --cflags gtk+-2.0 > a.txt
>pkg-config --libs gtk+-2.0 > b.txt
わたしの場合
a.txt
-mms-bitfields -IC:/opt/gtk/include/gtk-2.0 -IC:/opt/gtk/lib/gtk-2.0/include -IC:/opt/gtk/include/atk-1.0 -IC:/opt/gtk/include/cairo -IC:/opt/gtk/include/gdk-pixbuf-2.0 -IC:/opt/gtk/include/pango-1.0 -IC:/opt/gtk/include/glib-2.0 -IC:/opt/gtk/lib/glib-2.0/include -IC:/opt/gtk/include -IC:/opt/gtk/include/freetype2 -IC:/opt/gtk/include/libpng14 
 

b.txt
-LC:/opt/gtk/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl 
 

だった。
コマンドでリダイレクトしたテキストファイルの内容をBuild Variablesに追加
(プロジェクトのプロパティ > C/C++ Build > Build Variables)。最初のコマンドの内容を
gtk-inc,次のコマンドの内容をgtk-libとでもしておく。


プロジェクトのプロパティ > C/C++ Build > Settings --- Tool Settingタブ
GCC C++ Compiler > Commandline pattern と
MinGW C++ Linker > Commandline pattern の末尾に ${gtk-inc}と${gtk-lib}を追加。


⑥ビルドしてみる。
うまくいいってたらビルドできる。
 
こんなのが出るはず。


本物も基本的には同じであとconfig.hのフラグをしばらくいじったらあっさり出来た。
あと gcc の-Dの引数を#defineに変更してソースに書いた。なぜかmingWではgcc の-D引数に""つき文字列がうまく渡せないので。
最後にLINUXとWindwsのeclipseのソースを置いておく
windows http://1drv.ms/1qOyAeM 
linux   http://1drv.ms/1qOy1BG

まあちょっと難しいがおもしろかった。でこれからが仕事の土台が出来たので実際に使うアプリの作成にとりかかるってことになる。このためにeclipseを使えるようにしたのだった。