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++的名称修饰:
- 修改插件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"; // 你的实际插件名称 }
- 修改主程序中
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
相关产品推荐
相关产品推荐

