用g++构建用于MSVC应用程序的dll

Building dll with g++ for use with MSVC application

本文关键字:应用程序 dll MSVC 用于 g++ 构建      更新时间:2023-10-16

我的最终目标是在运行时从我的MSVC应用程序中执行g++来构建dll。g++创建的dll将被MSVC应用程序加载以供使用。

只是用命令行弄乱了一些测试代码,我设法建立了一个dll,但似乎有一些问题:

C:MinGWbin>g++ -shared -o testdll.dll AIFuncs_RF.cpp AIFuncs_RF.def
Warning: resolving _CreateAIModule by linking to _CreateAIModule@4
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups
Warning: resolving _DestroyAIModule by linking to _DestroyAIModule@0

下面是我的def文件:

LIBRARY "AIFuncs_RF"
EXPORTS
CreateAIModule=CreateAIModule @1
DestroyAIModule=DestroyAIModule @2

和dll main的代码:

BOOL APIENTRY DllMain(HMODULE hModule, DWORD Reason, LPVOID pReserved)
{ switch ( Reason )
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" void __stdcall
CreateAIModule()
{
}
extern "C" void __stdcall
DestroyAIModule()
{
}

知道为什么函数没有正确连接吗?

非常感谢您的帮助

gcc和Microsoft的C编译器的标准调用命名约定不同。gcc将压入堆栈的参数的大小添加到@后面的函数名中。女士不喜欢。您的def文件包含MS版本,因此gcc使用其自动修复来提供MS风格符号。

这本身不是错误。gcc只是警告你它已经做了这样的事情,你应该通过提供--enable-stdcall-fixup链接器标志(所以,-wl,--enable-stdcall-fixup到编译器调用)来明确这一点。

使用@符号的原因是相当合理的:stdcall函数在返回时从堆栈中弹出它们的参数,调用者将它们推入,因此它们必须完全同意这些参数的大小,否则将发生堆栈损坏并带来灾难性的结果。