使用LoadLibrary加载GCC编译DLL失败,仅C库DLL可加载求助
首先咱们直接定位核心问题:你遇到的加载失败,本质是GCC(MinGW)编译的C++ DLL依赖的动态C++标准库(比如libstdc++-6.dll)没被系统找到——依赖C库的DLL用的是系统自带的C运行时,所以能正常加载;VS编译的DLL要么依赖系统自带的MSVC运行时,要么你打包了运行时组件,因此没问题。另外你的代码里还有个小拼写错误,也可能影响功能,咱们一步步解决:
1. 修复extern "C"的拼写错误
你提供的DLL代码里,#ifdef __cpluplus少了一个s,正确的宏是__cplusplus。这个错误会导致extern "C"块不生效,函数名被C++名称修饰(mangling),后续GetProcAddress可能找不到目标函数(虽然你说依赖stdio的能运行,但还是要确认实际代码是否存在这个笔误)。修改后的代码如下:
依赖iostream的正确DLL代码
#ifdef __cplusplus extern "C" { #endif #include <iostream> __declspec(dllexport) void print(const char *x){ std::cout<<x<<std::endl; } #ifdef __cplusplus } #endif
2. 静态链接C++标准库(推荐方案)
默认情况下,MinGW编译C++ DLL会动态依赖libstdc++-6.dll,如果这个文件不在系统PATH里,LoadLibrary就会加载失败。我们可以通过编译参数强制静态链接C++运行时,把所有依赖打包进DLL,这样就不需要额外的运行时文件了。
修改你的compile函数里的命令,加上-static-libstdc++参数:
void compile(std::string name) { std::string temp; // 新增-static-libstdc++参数,静态链接C++标准库 temp = "g++ " + name + ".cpp -o dll/" + name + ".dll -shared -fPIC -static-libstdc++"; system(temp.c_str()); }
注:如果你的环境里
c++.exe是g++的别名,用c++.exe也可以,但MinGW环境下通常推荐用g++编译C++代码。
3. 备选方案:将MinGW运行时库加入系统PATH
如果不想静态链接,你可以把MinGW安装目录下的bin文件夹(比如C:\MinGW\bin)添加到系统环境变量PATH里,这样系统就能找到libstdc++-6.dll、libgcc_s_dw2-1.dll等依赖文件。添加后需要重启你的程序或电脑,让PATH生效。
4. 验证DLL依赖
你可以用Dependency Walker或者MinGW自带的ldd命令(在MinGW终端运行ldd your_dll.dll)检查DLL的依赖项:如果静态链接成功,依赖列表里就不会出现libstdc++-6.dll;如果是动态链接,要确保这些依赖文件在PATH可访问的位置。
按上面的步骤操作后,GCC编译的依赖C++库的DLL应该就能被LoadLibrary正常加载了。
内容的提问来源于stack exchange,提问作者Raiden Blackout




