Windows Mobileアプリケーションをクロス開発するためクロスコンパイラを準備しました。Interix用の手順はpmgrで追加パッケージにしました。ただしCeGCCそのものではないため問題があります。(後述)
- pmgr (arm-wince-pe-20081019.tar.gz)
実はパッケージ自体は3ヶ月くらい前にx64のクロスコンパイラと同時にできていたのですが、問題があったため公開していませんでした。
binutilsやgccにパッチを当てずにどこまで出来るか確認したかったため、CeGCCのパッチを当てずにオリジナルを使用しています。CeGCCからはヘッダとライブラリだけを持って来ていますが、CRTが使えません。(後述)
ソースをCeGCCのSVNから取得すれば良いというのは分かっていたのですが、Windows Mobile開発の必要に迫られていなかったため放置していました。しかしARMの実験にはこのままでも使えるようなので、とりあえず公開することにしました。
あくまでARMの実験用で、実用には不向きです。いずれCeGCCにきちんと対応したものを作り直す予定です。
使い方、制約など
以下のような問題があります。
- CeGCCのCRTが使えません。gccからリンクするとcrt0.oが見付からないというエラーになります。そのためエントリーポイントを自前で定義します。
- マクロが足りません。CeGCCのWin32APIのヘッダを使用するには-DARMオプションが必要です。CEのAPIはW系(Unicode)だけなので-DUNICODEオプションも必要です。
- シンボルの扱いがCeGCCとは異なります。そのままではDLLにリンクできないため-fno-leading-underscoreオプションが必要です。
これらの問題を回避して使う方法は以下の通りです。
次のソースをtest.cとして用意します。
#include <windows.h> void winmain() { MessageBox(0, L"HELLO", L"WORLD", MB_OK); } |
以下のようにするとtest.exeが出力されます。WILLCOM 03での動作を確認しました。
% arm-wince-pe-gcc -o test.exe -e winmain -DUNICODE -DARM -fno-leading-underscore test.c -nostdlib -lcoredll
正直、これでは既存のアプリケーションをコンパイルするのは厳しいです。やはりCeGCCでないと実用にはならないようです。