新闻中心

c++怎么在运行时动态加载库(dll/so)_c++跨平台动态链接库加载方法

2025-11-14
浏览次数:
返回列表
在C++中通过封装LoadLibrary/GetProcAddress和dlopen/dlsym实现跨平台动态库加载,Windows使用HMODULE,Linux/Unix使用void*,统一接口支持插件系统。

c++怎么在运行时动态加载库(dll/so)_c++跨平台动态链接库加载方法

在C++中实现运行时动态加载库(Windows下的DLL和Linux/Unix下的SO)是一项常见的跨平台需求,比如插件系统或模块化架构。虽然不同操作系统提供的API不同,但可以通过封装统一接口来实现跨平台兼容。

Windows: 使用 LoadLibrary 和 GetProcAddress

在Windows平台上,使用 LoadLibrary(或 LoadLibraryEx)加载DLL,用 GetProcAddress 获取函数地址,FreeLibrary 释放库。

示例代码:

#include <windows.h>
#include <iostream>
<p>typedef int (*AddFunc)(int, int);</p><p>int main() {
HMODULE lib = LoadLibrary(L"example.dll");
if (!lib) {
std::cerr << "无法加载DLL" << std::endl;
return -1;
}</p><pre class='brush:php;toolbar:false;'>AddFunc add = (AddFunc)GetProcAddress(lib, "add");
if (!add) {
    std::cerr << "无法获取函数地址" << std::endl;
    FreeLibrary(lib);
    return -1;
}

std::cout << "结果: " << add(2, 3) << std::endl;

FreeLibrary(lib);
return 0;

}

Linux/Unix: 使用 dlopen 和 dlsym

在类Unix系统中,通过 dlopen 加载共享库(.so),dlsym 获取符号地址,dlclose 释放库。

编译时需链接 dl 库:-ldl

Reachout.ai Reachout.ai

一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造

Reachout.ai 142 查看详情 Reachout.ai
#include <dlfcn.h>
#include <iostream>
<p>typedef int (*AddFunc)(int, int);</p><p>int main() {
void* lib = dlopen("./libexample.so", RTLD_LAZY);
if (!lib) {
std::cerr << "无法加载SO: " << dlerror() << std::endl;
return -1;
}</p><pre class='brush:php;toolbar:false;'>AddFunc add = (AddFunc)dlsym(lib, "add");
const char* error = dlerror();
if (error) {
    std::cerr << "无法获取函数: " << error << std::endl;
    dlclose(lib);
    return -1;
}

std::cout << "结果: " << add(2, 3) << std::endl;

dlclose(lib);
return 0;

}

跨平台封装示例

为了实现跨平台,可以封装一个简单的动态库加载类:

#ifdef _WIN32
    #include <windows.h>
    using LibHandle = HMODULE;
    #define LOAD_LIB(name) LoadLibraryA(name)
    #define GET_FUNC(lib, name) GetProcAddress(lib, name)
    #define FREE_LIB(lib) FreeLibrary(lib)
#else
    #include <dlfcn.h>
    using LibHandle = void*;
    #define LOAD_LIB(name) dlopen(name, RTLD_LAZY)
    #define GET_FUNC(lib, name) dlsym(lib, name)
    #define FREE_LIB(lib) dlclose(lib)
#endif
<p>class DynamicLib {
public:
explicit DynamicLib(const char* path) {
handle = LOAD_LIB(path);
}</p><pre class='brush:php;toolbar:false;'>~DynamicLib() {
    if (handle) FREE_LIB(handle);
}

void* getFunction(const char* name) {
    return GET_FUNC(handle, name);
}

bool isValid() const { return handle != nullptr; }

private: LibHandle handle = nullptr; };

使用方式:

DynamicLib lib("example.dll"); // 或 libexample.so
if (lib.isValid()) {
    auto add = (AddFunc)lib.getFunction("add");
    if (add) std::cout << add(2, 3) << std::endl;
}

注意事项与建议

  • C++存在函数名修饰(name mangling),推荐在导出函数前加上 extern "C" 防止重命名,确保符号可被正确查找。
  • 确保库的路径正确,相对路径可能因工作目录不同而失败,建议使用绝对路径。
  • 加载失败时及时处理错误(Windows用GetLastError,Linux用dlerror)。
  • 注意库的依赖关系,目标机器需具备运行所需的所有依赖库。
  • 跨平台构建时,可用CMake统一管理不同平台的编译规则。

基本上就这些。只要封装好平台差异,并规范导出接口,C++动态加载库并不复杂,但容易忽略细节导致运行失败。

以上就是c++++怎么在运行时动态加载库(dll/so)_c++跨平台动态链接库加载方法的详细内容,更多请关注其它相关文章!


# 有什么区别  # 南昌抖音关键词排名报价  # 美的seo优化论文  # 黑龙江推广关键词排名  # 快速优化网站对比照片  # 低价建设的网站  # 镇江网站建设全包  # 水产品营销推广  # 青岛seo网站优化推荐  # 重庆网站建设公司信息  # 专业的电商网站推广方法  # 可以通过  # 相关文章  # 所需  # 网络编程  # linux  # 第三方  # 动态链接库  # 微软  # 加载  # typedef  # stream  # win  # ios  # c++  # unix  # ai  # cad  # 操作系统  # windows 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AO3最新可访问网址 Archive of Our Own官方在线入口  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  J*a应用程序首次运行自动创建文件与目录的最佳实践  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  c++项目目录结构应该如何组织_c++工程化项目结构规范  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  微博网页版官方账号登录 微博网页版内容浏览使用指南  Lar*el 递归关系中排除指定分支的教程  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  Python字典中优雅地迭代剩余元素的方法  解决Flask中Quill编辑器内容提交失败及TypeError的指南  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  qq音乐在线播放入口_qq音乐电脑版登录链接  痛风发作了怎么办? 快速止痛和后期饮食调理  Mac怎么使用表情符号_Mac Emoji快捷键面板  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  快速CSGO开箱网站指南 CSGO开箱平台推荐  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  163邮箱注册官网 免费申请163个人邮箱  Pandas DataFrame:高效添加条件计算列  必由学官网入口 必由学教师登录入口  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  Flexbox布局实践:实现粘性导航栏与底部固定页脚  Python Socket多播通信中指定源IP地址的实践指南  必由学官方网站入口 必由学学生教师共用登录通道  Typer应用中动态命令行参数的解析与处理  晋江读书网页版在线登录 晋江读书电脑版官网  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  在Go Martini框架中高效服务动态生成图像的实践指南  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  HTML长属性值处理:表单action路径优化与代码规范应对  html5 app怎么运行环境_配html5 app运行环境【教程】  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  2025-2030年全球乘用车销量预测:新能源成增长主力  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  Win11怎么关闭快速启动_Win11彻底关机设置教程 

搜索