UNIX下C语言编程与实践11-UNIX 动态库显式调用:dlopen、dlsym、dlerror、dlclose 函数的使用与实例 - 指南
2025-10-24 16:56 tlnshuju 阅读(0) 评论(0) 收藏 举报一、引言:什么是动态库显式调用?
在 UNIX 环境下,动态库调用分为「隐式调用」和「显式调用」。动态库显式调用 是指在程序运行阶段,通过专门的函数(dlopen、dlsym、dlerror、dlclose)手动加载动态库、查找库中函数/变量地址、执行调用并关闭库,无需在编译阶段绑定动态库依赖。
动态库显式调用的关键优势是「灵活性」——可根据运行时条件(如配置文件、用户输入)决定是否加载库、加载哪个库,尤其适用于插件化制作、模块化扩展等场景。详细解析显式调用的四大核心函数、全流程实战及问题排查方法。
二、动态库显式调用核心函数解析
UNIX 系统提供 dlfcn.h 头文件封装显式调用的四大函数,需在编译时链接 -ldl 库(动态链接库)才能使用。四大函数的功能、参数及返回值如下:
| 函数原型 | 核心功能 | 关键参数说明 | 返回值 |
|---|---|---|---|
void *dlopen(const char *filename, int flag); | 打开动态库并加载到内存,返回库的句柄 | filename:动态库路径(绝对路径或相对路径,NULL 表示加载当前进程已加载的库);flag:加载模式(RTLD_LAZY:延迟绑定符号;RTLD_NOW:立即绑定符号) | 成功:返回非 NULL 的库句柄;失败:返回 NULL |
void *dlsym(void *handle, const char *symbol); | 根据符号名(函数名/变量名),从已打开的动态库中查找其地址 | handle:dlopen 返回的库句柄;symbol:要查找的符号名(字符串形式) | 成功:返回符号的内存地址; 失败:返回 NULL(需结合 dlerror 确认是否真的失败,因符号可能本身就是 NULL) |
const char *dlerror(void); | 获取上一次显式调用函数的错误信息,用于排查问题 | 无参数 | 成功:返回非 NULL 的错误信息字符串;无错误:返回 NULL |
int dlclose(void *handle); | 关闭动态库句柄,减少库的引用计数(计数为 0 时从内存卸载) | handle:dlopen 返回的库句柄 | 成功:返回 0; 失败:返回非 0 |
关键提示:
1. dlopen 的 flag 参数推荐使用 RTLD_NOW,避免延迟绑定导致运行时突然报错;
2. dlsym 返回的地址需强制转换为对应类型的指针(如函数指针、变量指针)才能使用;
3. 每次调用 dlopen、dlsym、dlclose 后,都应调用 dlerror 检查错误,避免错误信息被覆盖。
2.1 函数工作原理补充
(1)dlopen 加载动态库的过程
当调用 dlopen 打开动态库时,系统会执行以下步骤:
- 根据
filename路径查找动态库文件(支持相对路径、绝对路径,若路径不含/,则从LD_LIBRARY_PA
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945499.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
熟知大模型中mcp概念 --by zk
MCP核心概念解析
什么是MCP:让大模型拥有“手和脚”
大模型本身只有对话和决策能力,没有执行调用工具,获取资源的能力。因此定义一套让大模型调用外部能力的通用协议很重要。MCP(Model Context Protocol)是一套让…
【开题答辩全过程】以 “辛巴克餐饮”小程序为例,具备答辩的问题和答案
【开题答辩全过程】以 “辛巴克餐饮”小程序为例,具备答辩的问题和答案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …
2025年一体化雨水提升泵站厂家权威推荐榜单:污水提升泵站/一体化污水泵站/一体化雨水泵站源头厂家精选
在市政排水与水资源管理领域,一体化雨水提升泵站已成为现代城市基础设施的核心组成部分,其高效性能直接关系到城市防洪排涝能力与水环境保护质量。
随着全球城市化进程加速,市政排水系统面临前所未有的压力。据最新…
STM32软件I2C读写AT24C64 - 指南
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
读书笔记:解锁数据库查询新姿势:函数索引让你的搜索又快又准
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…
国产IPD项目管理软件推荐|别再靠 Excel 推 IPD 了!帮你把IPD流程从“纸上”搬进系统
本文盘点了国内能真正支撑 IPD 流程落地的几款软件,从配置灵活、可视化程度高的飞书项目,到深度面向研发的禅道,覆盖制造业、硬件、互联网等多场景。看完你就能判断:哪一款最适合你的组织,帮你实现从立项到评审、…
【源码解读之 Mybatis】【核心篇】--第7篇:ParameterHandler参数处理机制
【源码解读之 Mybatis】【核心篇】--第7篇:ParameterHandler参数处理机制第7篇:ParameterHandler参数处理机制
1. 学习目标确认
1.0 第6篇思考题解答
在深入学习ParameterHandler参数处理机制之前,让我们先回顾并解…
2025年教室护眼灯厂家权威推荐榜单:led教室灯/幼儿园教室灯/教室照明灯具源头厂家精选
随着社会对青少年视觉健康的日益关注,教室照明环境已成为学校建设的重点环节。专业的教室护眼灯不仅能有效降低学生近视发生率,还能提升学习效率。本文将基于行业调研与公开数据,对当前市场上具有代表性的教室护眼灯…
2025年自动定量灌装机厂家权威推荐榜单:称重灌装机/膏状灌装机/瓶灌装机源头厂家精选
在当今工业化进程中,自动定量灌装设备作为生产线核心环节,其技术水平直接影响企业生产效益与产品质量。随着智能制造的深入推进,灌装设备行业正经历着从机械化向数字化、智能化的重要转型。本文将基于行业数据与技术…
厨房电子秤芯片方案:SIC8833
本文介绍了采用SIC8833QFN32单片机开发的一款5KG量程,0.1g精度的厨房电子秤。该秤具备自动调零、2段自动标定功能,支持USB充电,并能进行模式和单位转换。用户可通过MODE和UNIT键在重量、水体积、牛奶体积模式以及公…
备份恢复:backup database format plus archivelog归档备份集路径与数据库format指定不一致
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。备份恢复:b…
在MCUXpresso IDE中建立使用静态库的工程 - 指南
在MCUXpresso IDE中建立使用静态库的工程 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。作者:杨兰馨(楠瑆)
背…
2025年江苏博士后微服务公司权威推荐榜单:博士后服务团/高层次人才服务/高层次人才引进源头公司精选
汇聚顶尖人才资源,构建创新驱动发展新引擎
在创新驱动发展的时代背景下,江苏省作为科技与人才高地,对博士后等高层次人才的需求日益增长。博士后微服务机构作为连接政府、企业、高校和人才的桥梁,已成为推动区域科…
RFSOC学习记录(六)混频模式分析
RFSOC学习记录(六),简要介绍混频模式以及利用xilinx官方频率规划器介绍混频
混频
混频器(Mixer)是RFSOC通过ip核实现在数字域的频率搬移,主要功能是在不改变采样率的情况下,把信号的频谱中心移动到目标频率附…
每周读书与学习-JMeter主要元件详细介绍(二)函数助手
每周读书与学习是由清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书的作者推出,分享作者多年的IT从业经历,希望对很多计算机科学技术IT类专业毕业生以及IT从业者有所帮助。
1、函数助手
函数助手是…
Launcher 桌面源码笔记一(3D车模桌面)
Launcher 桌面源码笔记一(3D车模桌面)3D车模通过TaskView显示在Launcher,首先需要知道,为什么要用TaskView,而不是Activity,然后在说加载流程
1、surface比activity等效率更高,特别是针对车模跟地图等重量级场景…