用g++构建用于MSVC应用程序的dll
Building dll with g++ for use with MSVC application
我的最终目标是在运行时从我的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函数在返回时从堆栈中弹出它们的参数,调用者将它们推入,因此它们必须完全同意这些参数的大小,否则将发生堆栈损坏并带来灾难性的结果。
相关文章:
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- C# DLL 从C++应用程序调用 SOAP Web 服务
- 将 c++ 生成器应用程序与外部 dll 结合使用
- WinDeployqt 不会为调试应用程序部署 Qwindowsd.dll
- Log4net,将日志消息从 c++ dll 发送到 c# 应用程序?
- 调试 ASP MVC 应用程序中使用的C++ DLL
- Qt应用程序找不到第三方DLL并崩溃
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 我可以用C++/WinRT编写一个DLL,供windows桌面应用程序(而不是UWP)或Unity插件使用吗
- .NET核心应用程序无法加载C++DLL
- 在通用 Windows 应用程序C++上使用 win32 DLL 库
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- 使用 C++ dll 运行 c# 应用程序会生成无法加载异常
- 为什么我的 C# 应用程序无法加载我的 C++ dll?
- 应用程序仅在qt调试器中加载dll,而不是独立加载
- 如果在 DLL 和调用应用程序中使用 GPGPU API,会发生什么情况
- C++ XE 5 应用程序和C++生成器 5 dll 兼容性
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- 使用Visual Studio 2015创建的C 应用程序分发MSVCR120.dll