动态加载库:dlopen详解-deepseek

功能:dlopen 用于在运行时打开动态链接库,并返回一个句柄给调用进程。
基本语法:void* dlopen(const char* filename, int flag);,其中 filename 是库文件的路径,flag 是打开模式(如 RTLD_NOW 或 RTLD_LAZY)。
获取符号地址:使用 dlsym 函数可以通过 dlopen 返回的句柄获取库中函数或变量的地址。
关闭库:使用 dlclose 函数来卸载打开的库。
错误处理:可以使用 dlerror 函数获取错误信息。

dlopen是 Unix/Linux 系统中用于动态加载共享库的函数。它是动态链接器接口的一部分,允许程序在运行时(而不是编译时)加载和使用共享库。

基本概念

函数原型

c

#include <dlfcn.h> void *dlopen(const char *filename, int flags);

主要参数

1.filename- 库文件路径

  • 绝对路径:如/usr/lib/libm.so

  • 相对路径:如./mylib.so

  • 仅库名:如libc,系统会在标准路径中查找

  • NULL:返回主程序的句柄

2.flags- 加载标志

常用标志(可组合使用):

标志说明
RTLD_LAZY延迟绑定(懒加载),使用时才解析符号
RTLD_NOW立即解析所有符号,加载时检查
RTLD_GLOBAL使库的符号全局可用
RTLD_LOCAL符号仅对本库可见(默认)
RTLD_NODELETEdlclose()时不卸载库
RTLD_NOLOAD不加载,仅检查是否已加载

返回值

  • 成功:返回库的句柄(void*类型)

  • 失败:返回NULL,可通过dlerror()获取错误信息

相关函数

c

// 获取错误信息 char *dlerror(void); // 查找符号(函数/变量) void *dlsym(void *handle, const char *symbol); // 关闭库 int dlclose(void *handle);

使用示例

示例1:基本使用

c

#include <stdio.h> #include <dlfcn.h> int main() { // 1. 打开共享库 void *handle = dlopen("libm.so.6", RTLD_LAZY); if (!handle) { fprintf(stderr, "Error: %s\n", dlerror()); return 1; } // 2. 获取函数指针 double (*cosine)(double) = dlsym(handle, "cos"); if (!cosine) { fprintf(stderr, "Error: %s\n", dlerror()); dlclose(handle); return 1; } // 3. 使用函数 printf("cos(0) = %f\n", cosine(0.0)); // 4. 关闭库 dlclose(handle); return 0; }

示例2:插件系统实现

c

// plugin.h - 插件接口 typedef struct { const char *name; void (*init)(void); void (*process)(int); void (*cleanup)(void); } Plugin; // main.c - 动态加载插件 void load_plugin(const char *plugin_path) { void *handle = dlopen(plugin_path, RTLD_NOW); if (!handle) { printf("Failed to load plugin: %s\n", dlerror()); return; } // 获取插件创建函数 Plugin* (*create_plugin)(void) = dlsym(handle, "create_plugin"); if (!create_plugin) { printf("Not a valid plugin\n"); dlclose(handle); return; } // 创建并使用插件 Plugin *plugin = create_plugin(); plugin->init(); plugin->process(42); plugin->cleanup(); dlclose(handle); }

编译注意事项

编译时需要链接dl库:

bash

gcc -o program program.c -ldl

应用场景

  1. 插件/扩展系统:允许第三方开发插件

  2. 按需加载:减少内存占用,加快启动速度

  3. 热更新:不重启程序更新功能

  4. A/B测试:动态切换不同实现

  5. 跨平台兼容:根据平台加载不同库

注意事项

  1. 内存管理:每次dlopen需要对应的dlclose

  2. 符号冲突:注意不同库中的同名符号

  3. 线程安全dlopen本身线程安全,但加载的库可能不是

  4. 错误处理:每次调用后都应检查错误

  5. 依赖关系:库的依赖库也需要可用

替代方案

  • Windows:LoadLibrary()/GetProcAddress()

  • macOS:NSAddImage()(底层也是dlopen

  • 更高级的封装:libltdl(GNU)、Boost.DLL(C++)

dlopen提供了强大的运行时动态加载能力,是实现模块化、可扩展应用程序的重要工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1135779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安川代码移植:基于瑞萨芯片且无PCB的主板原理图探索

安川代码移植的主板原理图 无pcb 采用瑞萨芯片在工业自动化领域&#xff0c;安川的技术一直有着广泛的应用。今天咱来聊聊安川代码移植到基于瑞萨芯片且无PCB设计的主板原理图相关的事儿。 瑞萨芯片的优势 瑞萨芯片在这类应用中有不少亮点。它以高性能、低功耗著称&#xff0c;…

收藏必看!RAG与CAG全面对比:如何选择最适合你的LLM知识整合方案

本文深入对比了大语言模型两种知识整合技术&#xff1a;检索增强生成(RAG)与缓存增强生成(CAG)。RAG通过实时检索外部数据确保知识时效性&#xff0c;适合动态更新场景&#xff1b;CAG预加载信息实现快速响应&#xff0c;适合稳定知识需求。文章详细分析了二者的技术原理、优劣…

跑步即工程:精确掌控你的身体

告别“玄学跑步”&#xff1a;一个ICT老兵的量化生活实验 跑者的数字双生&#xff08;Digital Twin of a Runner&#xff09;你是否有过这样的瞬间&#xff1f; 早上兴致勃勃地换上跑鞋&#xff0c;想来个“轻松”的5公里 。结果刚跑出小区大门没多久&#xff0c;心率就飙到了1…

【例4-2】牛的旅行(信息学奥赛一本通- P1343)

【题目描述】农民John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言&#xff0c;你能看到至少有两个牧区不连通。现在&#xff0c;John想在农场里添加一条路径 ( 注意&#xff0c;恰好一条 )。对这条路径有这样的限制&…

RK3399E Android 11 将自己的库放到系统库方法

1.系统库的准备1.1 检查库检查需要放入系统的系统库libxxx.so是否非TLS 64&#xff0c; 在命令行中输入&#xff1a;/home/xxx/Android/Sdk/ndk/27.3.13750724/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-readelf -l libxxx.so | grep -A5 TLS命令行输出&#xff1a;TLS…

网络安全IT产业就业与发展前景---个人观点分析分享,专业才能端好饭碗

网络安全IT产业就业与发展前景—个人观点分析分享&#xff0c;专业才能端好饭碗&#xff0c;技术脱节就得考虑转型 引言 网络安全产业作为国家战略基础设施的核心组成部分&#xff0c;其重要性在数字化转型浪潮中愈发凸显。在“网络强国”战略框架下&#xff0c;《网络安全法…

面向自然科学领域机器学习与深度学习(高维数据预处理—可解释ML/DL—时空建模—不确定性量化-全程AI+Python)

随着观测技术、数值模拟与计算基础设施的迅猛发展&#xff0c;地球系统科学、生态学、环境科学等自然科学领域正迈入“大数据智能模型”驱动的新阶段。传统的统计建模方法虽具可解释性&#xff0c;却难以应对高维、非线性、多源异构的复杂自然系统&#xff1b;而以机器学习和深…

AI水遥感---水体提取、水深反演、水温监测、水质参数AI反演,流水系,河道宽度提取等

随着全球水资源日益紧缺与水环境问题日益严峻&#xff0c;传统的水体监测方法已难以满足大范围、高时效、精细化的管理需求。遥感技术凭借其覆盖广、周期短、信息丰富的优势&#xff0c;正逐渐成为水环境监测的核心手段。然而&#xff0c;面对海量多源的遥感数据&#xff0c;如…

用Sambert-HifiGan为电子相册添加情感化语音描述

用Sambert-HifiGan为电子相册添加情感化语音描述 &#x1f4cc; 背景与需求&#xff1a;让电子相册“会说话”且“有情绪” 传统的电子相册多以静态图片轮播和背景音乐为主&#xff0c;用户体验趋于单一。随着AI语音技术的发展&#xff0c;语音合成&#xff08;Text-to-Speec…

Thinkphp-Laravel+uniapp微信小程序的医院专家门诊预约挂号系统

目录医院专家门诊预约挂号系统摘要项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理医院专家门诊预约挂号系统摘要 该系统基于ThinkPHP或Laravel框架后端与UniApp前端技术栈开发&#xff0c;旨在为医院提供高效、便捷的专家门诊预约挂号服务。通过…

用Sambert-HifiGan为电子相册添加情感化语音描述

用Sambert-HifiGan为电子相册添加情感化语音描述 &#x1f4cc; 背景与需求&#xff1a;让电子相册“会说话”且“有情绪” 传统的电子相册多以静态图片轮播和背景音乐为主&#xff0c;用户体验趋于单一。随着AI语音技术的发展&#xff0c;语音合成&#xff08;Text-to-Speec…

2026年国自然申请书大改版,今年的基金本子如何写??

内容如下&#xff1a;您在撰写国家自然科学基金项目申请书时&#xff0c;是否曾为“研究方案”“技术路线”“研究方法”等名词所困扰、是否对“研究目标”和“拟解决的关键科学问题”有什么本质区别而绞尽脑汁&#xff1f;长期以来&#xff0c;申请书模板中过于固化的条条框框…

代码随走随写!Jupyter Notebook+cpolar 让你的编程工作台 “装进口袋”

Jupyter Notebook 是一款能将代码、文字说明和图表无缝融合的工具&#xff0c;支持 Python、R 等 40 多种语言实时运行&#xff0c;就像一个 “会计算的笔记本”。它特别适合数据分析者做模型迭代、学生写编程作业、老师做代码演示&#xff0c;优点在于能边写代码边记录思路&am…

Thinkphp-Laravel+uniapp微信小程序的外卖点餐点单系统 商家协同过滤

目录外卖点餐系统协同过滤技术摘要技术架构实现要点应用效果与优化方向项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理外卖点餐系统协同过滤技术摘要 基于ThinkPHP-Laravel框架与UniApp开发的外卖点餐小程序系统&#xff0c;通过商家协同过滤算法…

PDF-Extract-Kit持续集成:CI/CD流水线配置

PDF-Extract-Kit持续集成&#xff1a;CI/CD流水线配置 1. 背景与目标 1.1 项目背景 PDF-Extract-Kit 是一个基于深度学习的 PDF 智能内容提取工具箱&#xff0c;由开发者“科哥”二次开发构建。该工具集成了布局检测、公式识别、OCR 文字提取、表格解析等核心功能&#xff0…

5个高可用图像转视频开源镜像推荐:免配置快速上手

5个高可用图像转视频开源镜像推荐&#xff1a;免配置快速上手 &#x1f31f; 引言&#xff1a;为什么选择预构建镜像&#xff1f; 在AI生成内容&#xff08;AIGC&#xff09;领域&#xff0c;图像转视频&#xff08;Image-to-Video, I2V&#xff09; 正成为创意表达和内容生产…

毕业生实习与就业管理系统的设计与实现毕业论文+PPT(附源代码+演示视频)

文章目录毕业生实习与就业管理系统的设计与实现一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;数据库结构与测试用例系统功能结构后台运行截图项目部署源码下载毕业生…

Thinkphp-Laravel+uniapp微信小程序的文明城市创建平台设计与实现

目录文明城市创建平台的设计与实现项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理文明城市创建平台的设计与实现 该平台基于ThinkPHP-Laravel框架与UniApp技术栈构建&#xff0c;旨在通过微信小程序载体推动文明城市创建工作的数字化、智能化转型…

CLIP图文匹配微调实战

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 CLIP图文匹配微调实战&#xff1a;从理论到垂直领域落地目录CLIP图文匹配微调实战&#xff1a;从理论到垂直领域落地 引言&#xff1a;为何CLIP微调是图文理解的“关键一跃” CLIP微调的…

PDF-Extract-Kit新闻稿处理:自动提取5W1H要素,媒体人必备

PDF-Extract-Kit新闻稿处理&#xff1a;自动提取5W1H要素&#xff0c;媒体人必备 这个工具能帮你解决什么问题 作为一名媒体编辑&#xff0c;每天面对堆积如山的PDF新闻稿&#xff0c;你是否经常遇到这些困扰&#xff1a; - 需要手动从几十页文档中找出关键人物、时间、地点 …