我使用__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