今までは、eMbedded Visual C++ 3.0でビルドしていたのですが、手に入らなくなってしまったのでVisual Studio 2005でビルドしてみました。
まず、wcecompatをgithubから取得して、新しいバージョンに上げます。素のままでビルドすると、スタックチェック用の関数が見つからずにリンク時にエラーになってしまったので、このパッチを当てます。コンパイルオプションに/GS-を追加しています。
OpenSSL 1.0.0aの方には、このパッチを当てます。コンパイルオプションから/MCを外して/MDと/GS-を追加し、Winsock 2を使うように変更して、必要なライブラリとリンクするようにしています。
後は環境を設定してビルドします。以下の環境変数を設定すれば良いはずです。
set PATH=C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\IDE;%PATH%;C:\Cygwin\bin set INCLUDE=C:\Program Files (x86)\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Include\Armv4i set LIB=C:\Program Files (x86)\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Lib\ARMV4I set OSVERSION=WCE501 set TARGETCPU=ARMV4I set PLATFORM=Windows Mobile 5.0 Pocket PC SDK set WCECOMPAT=C:\Users\username\wcecompat
ビルドすると、libeay32.dllのリンク時にエラーになるので、libeay32.defを編集して見つからないシンボル4つを削除します*1。これは、WindowsCE版では、ファイルディスクリプタベースのBIOが実装されていないためです。さらに、capi.dllのビルドでエラーになるので、ビルド対象から外します。CAPIを使うときにANSIベースのAPIを呼び出しているため、UNICODEベースのAPIしかないWindows CEではエラーになってしまいます。
とりあえず、これでlibeay32.dllとssleay32.dllはビルドできます。テストプログラムのビルドでは、またエラーが発生するかもしれません。そして、実機がないのでこれでちゃんと動くのかどうかも怪しいです…
*1 本当は、mkdef.plやlibeay.numあたりへのパッチで何とかできるような気がしますが、面倒なので手作業で