我的最终目标是从我的MSVC应用程序执行g ++以在运行时构建dll。然后,MS ++创建的dll将由MSVC应用程序加载以供使用。
使用命令行搞乱一些测试代码我设法构建了一个dll,但似乎有一些问题:
C:\MinGW\bin>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()
{
}
为什么函数没有正确链接的任何想法?
非常感谢您的帮助。
答案 0 :(得分:1)
gcc和Microsoft的C编译器的stdcall命名约定不同。 gcc将压缩到堆栈的参数的大小添加到@之后的函数名称。 MS没有。您的def文件包含MS版本,因此gcc使用其自动修复来提供MS样式符号。
这本身不是错误。 gcc只是警告你已经完成了这样的事情,你应该通过提供--enable-stdcall-fixup
链接器标志(因此,-wl,--enable-stdcall-fixup
到编译器调用)来明确这一点。
@ notation的原因是BTW相当理智:stdcall函数在返回时从堆栈中弹出它们的参数,并且调用者推送它们,因此它们必须完全同意这些参数的大小或堆栈损坏将发生灾难性的结果