我使用__stdcall调用约定使用MinGW 32位编译器创建了一个DLL。因为DLL是由需要此调用约定而没有@符号的外部工具使用的,所以我使用 -Wl, - kill-at 表示法。外部工具使用我生成的DLL成功运行。 如果我尝试将示例c应用程序链接到此库,则会因错误的调用约定而导致链接器错误。
这些是接口头文件中使用的宏。
#if defined(_WIN64)
#define CALL_CONV __fastcall
#elif (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)) && !defined(_NI_mswin16_)
#define CALL_CONV __stdcall
#endif
#ifdef IS_DLL_TARGET
#undef _VI_FUNC
#define _VI_FUNC __declspec(dllexport) CALL_CONV
#elif defined BUILDING_DEBUG_EXE
#undef _VI_FUNC
#define _VI_FUNC
#else
#undef _VI_FUNC
#define _VI_FUNC __declspec(dllimport) CALL_CONV
#endif
链接器抱怨
../main.c:343: undefined reference to `_imp__findRsrc@8'
什么接缝是正确的,因为我删除了@。我在链接库时尝试使用 -Wl, - kill-at 标记失败。我需要修改哪些内容才能成功链接到我修改过的__stdcall库。
我发现一个奇怪的事情,@。目录仍然存在于.def文件中。我的.lib和.dll文件只包含没有@。
的名称修改
我找到了解决方法,但构建进度仍然非常复杂,难以实现自动化。
gcc -o AddLib.dll add.o -shared -s -Wl,--subsystem,windows,--output-def,AddLib.def
gcc -o AddLib.dll add.o -shared -s -Wl,--subsystem,windows,--kill-at
dlltool --kill-at -d AddLib.def -D AddLib.dll -l libaddlib.a