/*
GCCによるDLL制作の手順
== 2000-02-15. presented by Einguste ==
== 2000-07-10. 追記 Cygwin情報 ==
== 2000-09-08. 更新 DEFツール ==
== 2002-01-16. 更新 DEFツール & 表現を一部変更 ==
== 2002-01-22. DEFツールが不要になりました(:- ==
== 2003-02-25. アーカイブ作成しなおし ==
== 2008-12-31. 今更ながら更新。アーカイブは古いまま ==
*/

GCC(MinGW,Cygwin)を利用してDLLを作成する際の参考資料です。簡易補助ツールは不要になりました。
At Your Own Risk です。
何かお気づきのところがありましたら、ご連絡いただけると幸いです。

Version 1.30
圧縮形式とサイズ
HSP向け情報Zip 111kBytes7-Zip 52.1kBytes
汎用DLLの情報Zip 1.98kBytes7-Zip 1.70kBytes
  1. a) MinGWのインストール
    MinGW: Minimalist GNU For Windows
    をご参考にしてください。
    今(2008/12/31)ならMinGW-5.1.4.exeを入手して展開。
    パスを通してコマンドプロンプトで作業するか、MSYSを導入すればOKですね。
    MSYS | MinGW

    b) Cygwin環境のインストール
    Cygwinのミラーサイト一覧
    現在はこちら
    Cygwin Information and Installation
    Snapshot情報が充実している藤枝さんのページ
    をご参考にしてください。
    (latestフォルダのsetup.exeをゲットして実行するだけで構築できました)

  2. DLLをプログラミングしましょう(^^)
    HSP用ならhspdll.htmlやhspsdkの情報を参考に作成します(^^;;
    エクスポートする関数の宣言に工夫をします。
    例えば __declspec(dllexport) void WINAPI func(argv) のWINAPIは不要です。
    bcc55と共通のソースを使用する場合、例えばこのようにするのはいかがでしょうか。

    #ifdef __MINGW32__
    #define DLLAPI
    #else
    #define DLLAPI WINAPI
    #endif

    __declspec(dllexport) void DLLAPI func(argv)


//コンパイル
gcc -c -g -O2 -Wall test1.c (-mno-cygwin)
gcc -c -g -O2 -Wall test2.c (-mno-cygwin)

cygwin環境の場合には、-mno-cygwinオプションを指定してください。
指定しないとcygwin1.dllが必要になります。

//DLL作成
dllwrap -s --export-all --output-def test.def --driver-name gcc -o test.dll test1.o test2.o test3.o (-mwindows) (-mno-cygwin)
cygwin環境の場合には、-mno-cygwinオプションを指定してください。
指定しないとcygwin1.dllが必要になります。
dllwrapのバージョンにより上手く動作しない場合があるようです。

現在は、makefileを作成してmakeコマンド一回で作成しています。
makefileの一例としてmakefile.txtを添付しました。

私、Eingusteは十分な理解をしていません。
試行錯誤によって手順を確立しています。
よって、繰り返しになりますが、At Your Own Risk です。
参考程度に止め、DLL作成は、あなた自身の判断と決断によって行なってください。

今更ですが補足です。
以前書いていた-mrtdオプションは試行錯誤の結果、付加したオプションなのですが、呼出規約を__cdeclではなく__stdcallに変更するオプションだったようです。
そのためEXPORTする関数に__stdcallを明示的に指定すれば不要なオプションでした。
ただその場合、呼び出す関数名に@数字がついてきます。
当時の記憶が定かではありませんが、多分、その部分の理解が足りなかったためか、楽をするために-mrtdオプションを使っていたのだと思います。
関数名についてはDEFファイルを作成するか、リンカに--kill-atか--add-stdcall-aliasを指示することで関数名そのままで呼び出すことができるのかな。
なので、今のバージョンだと
gcc -s -O2 -shared -o test.dll test1.c test2.c -Wl,--kill-at,--output-def,test.def,--out-implib,libtest.a (-mno-cygwin)
またはDEFファイルを作成して
gcc -s -O2 -shared -o test.dll test1.c test2.c test.def -Wl,--out-implib,libtest.a (-mno-cygwin)
といった感じになるんだと思います。


MinGW: Minimalist GNU For Windowsという素晴らしい開発環境を公開、メンテナンスされています諸氏に感謝いたします。

Top page

Valid HTML 4.01 Transitional 正当なCSSです!