You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用LoadLibrary加载GCC编译DLL失败,仅C库DLL可加载求助

解决GCC编译依赖C++库的DLL无法被LoadLibrary加载的问题

首先咱们直接定位核心问题:你遇到的加载失败,本质是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++.exeg++的别名,用c++.exe也可以,但MinGW环境下通常推荐用g++编译C++代码。

3. 备选方案:将MinGW运行时库加入系统PATH

如果不想静态链接,你可以把MinGW安装目录下的bin文件夹(比如C:\MinGW\bin)添加到系统环境变量PATH里,这样系统就能找到libstdc++-6.dlllibgcc_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

火山引擎 最新活动