gentooからmingwのクロスコンパイル
そろそろDirectX関連の活動を再開しようと コードを触りはじめたのだが
5月いっぱいw3mばかり弄っていたのもあって、
IDE触るのがどうもたるい。
これは一種のvi病のような気もするが、
マウス操作は当然のこととしてホームポジションから離れるのが
めんどくさ。
そこでcygwin上のvimからDirectXの開発をしようとしたのだが
set makeprg=vcbuild
というような感じでビルドまではできるのだが
cl.exe用の定義がないのでquickfixできないのでリズムが悪い。
そこで、gccを使ってみることにする。
DEFINEとかCFLAGS, LDFLAGSを多少工夫する必要があったが
vcと同じコードをコンパイルし実行することができた。
# DirectXのパス通し $ ln -s "/cygdrive/C/Program Files/Microsoft DirectX SDK (November 2008)/Lib/x86" /usr/local/lib/DirectX $ ln -s "/cygdrive/C/Program Files/Microsoft DirectX SDK (November 2008)/Include/x86" /usr/local/include/DirectX CXXFLAGS=-I/usr/local/include/DirectX LDFLAGS=-L/usr/local/lib/DirectX -ld3dxof -ldxguid -ld3dx9 -ld3d9 -lwinmm
ついでなのでcygwin.dllに依存しないように-mno-cygwinオプションを追加してみたところ
gcc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler.
とかいわれる。
しかし今使っているのはgcc-4なので、
mingwを入れるとgcc-3の方が混ざってしまいぐちゃぐちゃになるのでcygwinのmingwは避けたい。
こうして、
どうせcross-compileerならLinuxの方に用意すればいいじゃないと思い至った。
(前置き終わり)
(ここからgentoo)
調べてみたところcrossdevというのを使えばいいらしいのでやってみた。
# emerge crossdev
これはすぐに終わる。
つぎにMingwをターゲットにしてクロスコンパイル環境をビルドする。
# crossdev -t i686-mingw32 -------------------------------------------------------------------------------- * Host Portage ARCH: x86 * Target Portage ARCH: x86 * Target System: i686-mingw32 * Stage: 4 (C/C++ compiler) * binutils: binutils-[latest] * gcc: gcc-[latest] * headers: w32api-[latest] * libc: mingw-runtime-[latest] * PORTDIR_OVERLAY: /usr/portage/local/pc_local * PORT_LOGDIR: /var/log/portage * PKGDIR: /usr/portage/packages/cross/i686-mingw32 * PORTAGE_TMPDIR: /var/tmp/cross/i686-mingw32 _ - ~ - _ - ~ - _ - ~ - _ - ~ - _ - ~ - _ - ~ - _ - * Forcing the latest versions of {binutils,gcc}-config/gnuconfig ... [ ok ] * Log: /var/log/portage/cross-i686-mingw32-binutils.log * Emerging cross-binutils ... [ ok ] * Log: /var/log/portage/cross-i686-mingw32-w32api-quick.log * Emerging cross-w32api-quick ... [ ok ] * Log: /var/log/portage/cross-i686-mingw32-mingw-runtime-headers.log * Emerging cross-mingw-runtime-headers ... [ ok ] * Log: /var/log/portage/cross-i686-mingw32-gcc-stage1.log * Emerging cross-gcc-stage1 ... [ ok ] * Log: /var/log/portage/cross-i686-mingw32-w32api.log * Emerging cross-w32api ... [ ok ] * Log: /var/log/portage/cross-i686-mingw32-mingw-runtime.log * Emerging cross-mingw-runtime ... [ ok ] * Log: /var/log/portage/cross-i686-mingw32-gcc-stage2.log * Emerging cross-gcc-stage2 ... [ ok ]
しばらく放置しておけば
なんの問題もなくあっさり完了していた。
最後、使ってみる
$ cat wintest.c #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox (NULL, "Hello", "Hello Demo", MB_OK); return (0); } $ i686-mingw32-gcc wintest.c -o wintest.exe -mwindows $ wine wintest.exe # 動いた
さらにWindowsXPにもっていっても問題なく動いた。
思ったよりお手軽だ。
うちはGentooマシンが一番パワーあるので助かる。
後でDirectXを使うものがいけるか試してみるとしよう。