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

标签 c++ visual-c++ dll g++

我的最终目标是从我的 MSVC 应用程序执行 g++ 以在运行时构建 dll。 g++ 创建的 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()
{
}

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

非常感谢您的帮助。

最佳答案

gcc 和 Microsoft 的 C 编译器的 stdcall 命名约定不同。 gcc 在@ 之后将压入堆栈的参数的大小添加到函数名中。微软没有。您的 def 文件包含 MS 版本,因此 gcc 使用其自动修复来提供 MS 风格的符号。

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

使用 @ 符号的原因是顺便说一句:stdcall 函数在返回时从堆栈中弹出它们的参数,调用者压入它们,因此它们必须完全同意这些参数的大小,否则堆栈损坏将导致灾难性的结果.

关于c++ - 使用 g++ 构建用于 MSVC 应用程序的 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623200/

相关文章:

python - 使用 Boost/python.hpp 的 CMake 编译 c++ 程序

c++ - 从 vector 中排序和提取元素

c++ - 问题 C1083 : cannot open include file: 'chrono' : no such file or directory pops out

c++ - 重新编译 MFC 扩展 DLL 更改导出函数的入口点

winapi - 在64位应用程序中加载32位DLL库

c++ - gSOAP - 如何使用 SSL 和自签名证书

c# - 是否有一种算法可以确定二维空间中的一组点是否形成一个封闭区域?

visual-c++ - 功能码对齐到16字节

c++ - 如何在 C++ 中创建 3D 欧几里得点云和恒定距离网格

java - 使用 JNA 并行调用不可重入 native 函数