You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MinGW环境下C++插件系统因名称修饰导致GetProcAddress失败求助

解决MinGW g下C插件DLL函数找不到的问题

问题根源

你遇到的错误是因为MinGW g++的名称修饰(name mangling)规则和参考文章中使用的编译器(大概率是MSVC或其他版本GCC)不一致,导致硬编码的修饰后函数名_Z6getObjv、_Z7getNamev在你的DLL导出表中不存在。

解决方案

方案1:获取DLL的实际导出函数名

用MinGW自带的nm工具查看DLL的导出符号,步骤如下:

  • 打开MinGW命令行终端,进入DLL所在目录
  • 执行命令:nm -D your_plugin.dll(替换your_plugin.dll为你的实际DLL文件名)
  • 在输出中找到getObj和getName对应的修饰后名称(可能因编译选项不同有变化)
  • 将主程序中GetProcAddress的第二个参数替换为实际的修饰名

方案2:用extern "C"避免名称修饰(推荐)

这是更可靠的方式,让函数以C语言的方式导出,跳过C++的名称修饰:

  1. 修改插件DLL的代码,给导出函数加上extern "C"和__declspec(dllexport):
// 插件DLL中的代码
extern "C" __declspec(dllexport) Base* getObj() {
    return new DerivedObj(); // 你的实际对象创建逻辑
}

extern "C" __declspec(dllexport) const char* getName() {
    return "Your Plugin Name"; // 你的实际插件名称
}
  1. 修改主程序中GetProcAddress的调用,直接使用原函数名:
ObjProc objFunc = (ObjProc) GetProcAddress(mod, "getObj");
NameProc nameFunc = (NameProc) GetProcAddress(mod, "getName");

方案3:检查DLL编译命令

确保编译插件DLL时使用了正确的编译参数:

g++ -shared -o plugin.dll plugin.cpp -Wl,--out-implib,plugin.lib

其中-shared指定编译为共享库,-Wl,--out-implib生成导入库(可选,但方便后续链接)。

额外注意事项

  • 确保主程序和DLL使用相同的编译器和编译选项(比如都是32位或64位),否则可能出现兼容性问题
  • 如果DLL中使用了C++类,确保主程序和DLL的类定义完全一致,避免内存布局不一致导致的错误

内容的提问来源于stack exchange,提问作者Yuki Matuzaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:25:00