Palm Programmer's Laboratory
【C/C++】 Cygwin gcc で ARMlet 代替 DLL をビルドする方法
[開発情報]
概要
このページでは、PODS 付属の Cygwin に含まれる gcc を使用して Palm OS Simulator 向けの ARMlet 代替 DLL をビルドする方法について説明しています。
「【C++】 ARMlet と 68K におけるコード共有」のページで添付ファイルとして示したサンプルプロジェクトでは、ARMlet 代替 DLL は Microsoft Visual C++ でビルドする前提のプロジェクト形式になっていました。これを PODS に付属する Cygwin 環境内の gcc でビルドする方法を示します。
ソースコード
「【C++】 ARMlet と 68K におけるコード共有」の ARMletSample.zip に含まれる ARMlet のエントリポイントは、FooMain.cxx にあります。このコードは、このページで作成する Cygwin gcc 版 ARMlet 代替 DLL でもそのまま使用できます。
#include "Platform.hxx" #include <PceNativeCall.h> #include "PalmOSAPI.hxx" #include "FooImp.hxx" #include "FooParam.hxx" #ifdef PLATFORM_SIMULATOR #define EXPORT __declspec(dllexport) #define ARMLET_MAIN ARMlet_Foo #else #define EXPORT #define ARMLET_MAIN ARMlet_Main #endif class FooParam; extern "C"{ EXPORT unsigned long ARMLET_MAIN( const void* pEmulState, void* pUserData68K, Call68KFuncType* pCall68KFunc ) { PalmOSAPI api( pEmulState, pCall68KFunc ); FooParam* pData = static_cast<FooParam*>( pUserData68K ); pData->ReverseEndian( ); unsigned long ret = FooImp::Execute( *pData, &api ); pData->ReverseEndian( ); return ret; } }
コンパイル条件は Visual C++ の場合と同じで、シンボル PLATFORM_SIMULATOR が define されている必要があります。ARMletSample ではインクルードパスを制御してヘッダファイル Platform.hxx の種類を変える方法をとっていましたので、それをそのまま踏襲します。
このファイルの他に、ARMletSample では FooImp.cxx と PalmOSAPI.cxx が必要になるため、それらも Cygwin gcc でコンパイルする必要があります。
メイクファイル
インクルードパス
インクルードパスの指定では、PceNativeCall.h などの Palm OS SDK に含まれるヘッダファイルと、プロジェクト内に存在するヘッダファイルをインクルードできるようにしておく必要があります。
INCLUDEPATH = -I ../ARMletSample/Src/Include_Simulator \ -I ../ARMletSample/Src/CrossPlatform \ -I 'C:/Program Files/Metrowerks/CodeWarrior/Palm OS Support/Incs/Core/System' \ -I 'C:/Program Files/Metrowerks/CodeWarrior/Palm OS Support/Incs'
コンパイルオプション
Cygwin gcc で DLL を作成する場合、リンク時のオプションとして -shared を指定します。
gcc -g -c foo.c gcc -shared -o foo.dll foo.o
しかし、上記の方法では DLL は作成できるものの、Palm OS Simulator から呼出しても動作しません。Cygwin に含まれる gcc は、デフォルトで Cygwin に依存したモジュールを作成するためです。Cygwin に依存しないモジュールを作成するには、-mno-cygwin オプションを追加します。
gcc -mno-cygwin -g -c foo.c gcc -mno-cygwin -shared -o foo.dll foo.o
サンプルファイル
「【C++】 ARMlet と 68K におけるコード共有」のページで添付ファイルとして示したサンプルプロジェクトと同じもので、DLL 作成のためのプロジェクトを Cygwin gcc 向けの makefile に置き換えたものを添付します。
ARMletSample.zip(451)
- 注意!
- 上記サンプルプロジェクトファイルは、詰めが甘いため、Palm OS Simulator で実行すると、Simulator がエラーダイアログを表示します。「Ignore」ボタンを何度か押すと DLL が動作しますが、原因は分かっておらず、環境によっては発生しません。
デバッグについて
デバッグについてはまだ試していませんが、gdb を利用して Palm OS Simulator を起動、デバッグ対象の ARMlet を使用する palmware を実行することでデバッグが可能と思われます。後日、この部分については追記するかもしれません。