新闻中心
c++怎么在运行时动态加载库(dll/so)_c++跨平台动态链接库加载方法
在C++中通过封装LoadLibrary/GetProcAddress和dlopen/dlsym实现跨平台动态库加载,Windows使用HMODULE,Linux/Unix使用void*,统一接口支持插件系统。

在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
一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造
142
查看详情
#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×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彻底关机设置教程


2025-11-14
浏览次数:次
返回列表
e <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;