@[nn] なかんじの *.dll を gcc/cygwin でコンパイル

某製品で公開されている AAA.lib, AAA.dll があって, 関数 FFF を呼び出す test.c を書いた.
gcc/cygwinコンパイルしたいのだけどリンクがうまくいかないという状況.

$ gcc test.c -L. -lAAA
test.o: test.c:(.text+0xbf): undefined reference to `_FFF`
$ nm AAA.lib |grep FFF
00000000 T _FFF@24
00000000 I __imp__FFF@24
$ nm AAA.dll
nm: AAA.dll: no symbols

@[nn] がダメな感じ. dlltools を使えばいいようなことが書いてるところをちらほらみつけたが, dll が "no symbol" ではない雰囲気. -D で AAA.lib を渡しても同じ.

$ echo EXPORTS > AAA.def
$ nm AAA.lib | grep 'T _' | sed 's/^.* T _//' >> AAA.def
$ dlltool -k -d AAA.def -D AAA.dll -l libAAA.a
$ nm libAAA.a | grep FFF
00000000 T _FFF@24
00000000 I __imp__FFF@24
$ dlltool -k -d AAA.def -D AAA.lib -l libAAA.a
$ nm libAAA.a | grep FFF
00000000 T _FFF@24
00000000 I __imp__FFF@24
$ gcc test.c libAAA.a
test.o: test.c:(.text+0xbf): undefined reference to `_FFF`

@[nn] がなければコンパイルは通る.

$ echo EXPORTS > AAA.def
$ nm AAA.lib | grep 'T _' | sed 's/^.* T _//' | sed 's/@.*$//' >> AAA.def
$ dlltool -k -d AAA.def -D AAA.dll -l libBBB.a
$ nm libBBB.a | grep FFF
00000000 T _FFF
00000000 I __imp__FFF
$ gcc --mno-cygwin test.c -L. -lBBB

実行すると libBBB.a と AAA.dll の対応がとれてないから, "a.exe - エントリポイントがみつかりません".


公開されているヘッダファイルをみると(08/07追記),

#if hogehoge
#    define M_DECL __stdcall
#else
#    define M_DECL
#endif
extern int M_DECL FFF();

hogehoge を定義すればいけた. 上記の dlltool とか不要...

$ cpp -dM /dev/null | grep stdcall
#define _stdcall __attribute__((__stdcall__))
#define __stdcall __attribute__((__stdcall__))