dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名就是一个动态库so文件,标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻计算;如果设置的是 RTLD_LAZY,则在需要的时候才计算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加载的库可以获得其中的符号。当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。由 www.169it.com 搜集整理

在dlopen()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。

mode是打开方式,其值有多个,不同操作系统上实现的功能有所不同,在linux下,按功能可分为三类:

1 解析方式

RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)。

RTLD_NOW: 需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL,错误为:: undefined symbol: xxxx.......

2 作用范围,可与解析方式通过“|”组合使用

RTLD_GLOBAL:动态库中定义的符号可被其后打开的其它库重定位。

RTLD_LOCAL: 与RTLD_GLOBAL作用相反,动态库中定义的符号不能被其后打开的其它库重定位。如果没有指明是RTLD_GLOBAL还是RTLD_LOCAL,则缺省为RTLD_LOCAL。

3 作用方式

RTLD_NODELETE: 在dlclose()期间不卸载库,并且在以后使用dlopen()重新加载库时不初始化库中的静态变量。这个flag不是POSIX-2001标准。

RTLD_NOLOAD: 不加载库。可用于测试库是否已加载(dlopen()返回NULL说明未加载,否则说明已加载),也可用于改变已加载库的flag,如:先前加载库的flag为RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)后flag将变成RTLD_GLOBAL。这个flag不是POSIX-2001标准。

RTLD_DEEPBIND:在搜索全局符号前先搜索库内的符号,避免同名符号的冲突。这个flag不是POSIX-2001标准。

函数返回值:

打开错误返回NULL

成功,返回库引用

编译时候要加入 -ldl (指定dl库)

具体代码举例如下:

dlopen linux 实例_Linux下c函数dlopen实现加载动态库so文件代码举例相关推荐

  1. linux平台 加载动态库dlsym返回null

    linux 平台加载动态库通常使用dlopen,dlsym,dlclose三个函数实现 最近写了一个小程序,遇到dlsym总是调用失败返回空值,查找了很多相关的资料,确定动态库的创建有问题.下面是最初 ...

  2. Linux系统程序运行时加载动态库路径顺序

    程序运行时加载动态库路径顺序(Linux) 在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找: 链接时路径(Link-time path)和运行时路径(Run-time ...

  3. linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...

    今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...

  4. linux加载动态库问题

    当我们在linux系统引用动态库时,经常会遇到一个问题,加入我们需要的动态库没有在系统的默认目录下,我们编译时使用-L指定了动态库的路径,编译时没有问题,但是执行调用该动态库的可执行文件时,却提示找不 ...

  5. dlopen linux 实例_Linux静态库和动态库

    库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大 ...

  6. linux中动态加载动态库的方法

    功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义 : void * dlopen( const char *  pathname , int  mod ...

  7. linux下项目开发加载动态库:ldconfig与 /etc/ld.so.conf

    场景:自己开发一个项目,程序里包含一些自定义动态库.运行,需要加载这些动态库. 假如这些库在/pro/output/lib/下面,可执行程序在/pro/output/bin/下面. 那么,我们需要: ...

  8. Linux添加相对库路径,Linux C编程(8) 使用相对路径加载动态库-rpath和$ORIGIN

    商业程序如何加载自己的so 使用LD_LIBRARY_PATH的缺点是要实现设置LD_LIBRARY_PATH.不够自动化.那么大型的商业程序是如何加载自己的so呢. 这里以QtCreator为例. ...

  9. java jsp 页面下拉框 ajax异步加载数库数据

    全面详细的新手下拉框数据显示.web项目中难免用到下拉框异步加载数据的情况.这里分享一个.使用的是jquery的ajax异步加载后台数据.后台使用java语言. 1,先看效果,下拉框如下: 2.获取值 ...

最新文章

  1. 小红书做直播的背后,隐藏了什么秘密?
  2. 属性总结(三):plt.rcParams
  3. OpenCV3.2+VS2013+Tesseract3.02.02配置
  4. 【Elasticsearch】 es 索引 内置 字段 _source
  5. bat获取命令返回值_全网都在找的redis字符串命令,总结在这了
  6. 分析微信小程序生成二维码接口报错41030: invalid page hint
  7. 服务器硬盘一直亮红灯怎么回事,请问:电脑的硬盘为何一直亮着红灯?且硬盘很 – 手机爱问...
  8. MATLAB如何导出高分辨率的模型图片、PDF
  9. ps 打开失败 提示:暂存盘已满
  10. SPSS(七)非线性回归过程
  11. 企业如何通过TPM管理降低设备维修费用?
  12. 中国大学MOOC-陈越、何钦铭-数据结构-习题解答-04 树(中)
  13. 计算机网络:从入门到放弃
  14. 【期末大作业】基于HTML+CSS+JavaScript南京大学网页校园教育网站html模板(3页)
  15. Android平台上的PacketSender
  16. 21根火柴常胜将军c语言,常胜将军算法
  17. 一个跑步时用的轨迹记录和计步器APP
  18. PHP将word文件转为图片预览
  19. python记录程序运行时间的三种方法
  20. 笛卡尔坐标变换: UVA1602

热门文章

  1. idea中,git的cherry-pick怎么用?
  2. HDU 1237 求一个连通图中的哈密顿回路数(同一个状态下的哈密顿回路数)
  3. log4j:WARN No appenders could be found for logger 解决方案
  4. DO447使用过滤器和插件转换器--使用过滤器处理变量
  5. 华东师大计算机专业考研难度,华东师范大学考研有多难?
  6. Unity Xlua 之 Lua调用C#(三)
  7. 2023年 中国制造业这三大趋势不可忽视
  8. 崩坏3九游服务器稳定吗,《崩坏3》卡级真的有必要吗 高级区红莲是什么样子
  9. dSploit—Android网络***套件测试小记(含视频)
  10. 大学生校园生活心得感悟