MinGW DLL __stdcall调用约定链接器错误

时间:2018-03-08 10:09:39

标签: c dll linker mingw stdcall

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

0 个答案:

没有答案