@[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__))