我使用__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库 .
我发现@notation存在于.def文件中的一个奇怪的事情 . 我的.lib和.dll文件只包含没有@的名称 .
Edit:
我找到了一个解决方法,但构建进度仍然很复杂,很难实现自动化 .
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