Linux动态库加载

在Linux下,动态库格式一般为libxxx.so或者libxxx.so.3这种格式。
通常我们在网上下载下来源码包,编译之后会是libxxx.so软连接libxxx.so.1链接libxxx.so.1.23这种形式。.so后面分别大版本和小版本含义。
在加载动态库时一般有静态和动态两种加载方式:
1.静态加载(隐式加载):在链接时将其链接进目标文件。
链接分两种:

  • 指明具体库文件径,如“/home/test/libxxx.so”,在链接时就会自动链接该文件。
  • 使用系统路径,如"/lib","/usr/lib","/usr/local/lib","/lib/x86_64-linux-gnu"以及使用LD_LIBRARY_PATH等环境变量含的径

在编译时的格式如:
绝对路径或相对径:g++ test.cpp -o test /home/test/libxxx.so -I /home/test/include
对于指明路径的,直接写上路径即可。-I(大写i)参数后面加上编译所需要的头文件。
系统路径:g++ test.cpp -o test -lxxx
对于系统路径下的动态库,libxxx.so这种形式的库可以直接使用-l(小写L)跟上lib后面“xxx”来进行链接,编译器会自动在系统目录中寻找。
2.动态加载(显式加载):
在程序中动态加载动态库,当运行到加载处时,才会将动态库加载进来。
动态加载需要包含的头文件:#include<dlfcn.h>
①打开动态链接库:

void *dlopen (const char *filename, int flag);
flag:
RTLD_NOW:在dlopen返回前,解析出全部没有定义的符号,解析不出来返回NULL。
RT_GLOBAL:动态库定义的符号可被其后打开的其他库解析。
RT_LOCAL:和上面相反,不能被其他库解析。默认。
RTLD_LAZY:暂缓决定,等有需要时再解出符号

返回值:
打开错误返回NULL
成功,返回库引用
②取函数:

void *dlsym(void *handle, char *symbol);
将dlopen返回的句柄传入dlsym的handle,symbol参数则是要是用的符号(函数名)

③关闭动态链接库:

int dlclose (void *handle);
returns 0 on success, and nonzero on error.

用于关闭对应句柄的动态库,释放资源
只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
示例:

void *handle;
int (*function_add)(int,int);
char *error;
handle = dlopen ("/home/test/libxxx.so", RTLD_LAZY);
if (!handle) {  fprintf (stderr, "%s ", dlerror());  exit(1);
}  function_add = (int(*)(int))dlsym(handle, "add");

示例2:

test.h
typedef int   (*Add)( int a,int b);
static Add add= NULL;
test.cpp
void *handle;
handle = dlopen ("libadd.so", RTLD_LAZY);
if (!handle) {  fprintf (stderr, "%s ", dlerror());  exit(1);
}
add=(*Add)dlsym(handle,"Add");

复杂情景:
程序使用动态库a时,动态库a又使用了动态库b
静态加载:
动态库b需要在系统目录下或者在动态库a编译时指定链接的路径下。
动态加载:
可以在程序中先动态加载动态库b,即dlopen(“libb.so”);之后再dlopen(“liba.so”);之后再进行动态库a的函数地址获取与使用。

测试:
编译好一个libpng.so之后,使用ldd查询其依赖的libz.so的位置:

刚刚编译出来时,链接的libz指向了编译时寻找的/usr/local/lib/libz.so(注:编译时记得添加-fPIC指明动态库与位置无关)

将/usr/local/lib/libz.so删除后,再次使用ldd,发现又指向了系统目录下的libz。同时运行动态加载了libpng的test程序,仍可以正常运行

再次将系统目录下的libz.so删除后,使用ldd无法找到libz.so,同时运行test程序会提示找不到依赖。
修改test的代码,在动态加载同目录的libpng之前,先动态加载同目录下的libz。编译后运行成功。

Linux动态库的动态加载与静态加载以及加载依赖了其他动态库的动态库相关推荐

  1. 【Linux后端开发必问】操作系统系列(Linux常用命令、文件权限修改、静态与动态库的制作)

    目录 一.说说常用的Linux命令 二.文件权限如何修改 三.静态库和动态库的制作 1.静态库 2.动态库的制作 3.两者优势对比 一.说说常用的Linux命令 1.cd命令:用于切换当前目录: 2. ...

  2. 动态加载和静态加载及其编译步骤

    在类unix操作系统中,驱动加载方式一般分为:动态加载和静态加载,下面分别对其详细论述. 一.动态加载 动态加载是将驱动模块加载到内核中,而不能放入/lib/modules/下.     在2.4内核 ...

  3. 动态加载vs静态加载

    动态加载: 1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存. 2:可以在没有dll时候发现,而不致程序报错. 3:加载 ...

  4. OpenLayers加载不同类类型的天地图(矢量图、影像图、地形图)并实现动态切换效果

    前言 OpenLayers开发库如何实现加载不同类类型的天地图(矢量图.影像图.地形图)并实现动态切换效果,如下图所示. 一.涉及技术及数据 开发库:OpenLayers 6.Jquery 地图源:天 ...

  5. C/C++库文件全了解(包含静态库、动态库,包含windows、linux,包含dll、lib、so)

    目录 C/C++库文件全了解 一. 前言 二. 名词解释 2.1. windows的静态库:xxx.lib 2.2. windows的动态库:xxx.dll 2.3. linux的动态库:libxxx ...

  6. python selenium 爬取js加载的内容为空,Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容...

    1,引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor.本文记录了确定gsExtractor的技术路线过程中所做的编程实验.这是第二部分,第一 ...

  7. c语言将程序写为动态库,VS下生成C程序静态库(LIB)及动态库(DLL)的方法

    一.前言 工作中有时候因为分工合作的原因需要让别人调用自己写的代码去完成某项功能,但是又不想让别人看到具体的实现过程,只是提供一个API形式的接口供别人调用:又或者是其他的一些原因,有必要学习静态库及 ...

  8. 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入

    成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入 目录 解决问题 解决思路 解决方法 解决问题 .pyx格式文件,在window ...

  9. android module 加载.so,关于Android Studio主Module与依赖Module同时引入so库的问题

    在使用so库的时候遇到一个问题,背景以下:java 项目中有一个录像功能,将录像功能抽取出来变成一个module,这个module引入了一个ffmpeg的so库,将录像功能集成后经测试好用.架构 后来 ...

  10. linux怎么查看ip地址类型(查看静态ip、查看固定ip、查看动态ip)(ip addr show、nmcli dev show)

    文章目录 方法1:ip addr show 方法2:nmcli dev show 方法1:ip addr show ip addr show 如果网络接口已配置为静态IP地址,则在输出中会看到以下内容 ...

最新文章

  1. VC++环境下获取当前输入法名称
  2. 可能是GitHub上最好用的文字语法校验工具
  3. nginx php 配置
  4. hadoop 2.7 java_Hadoop2.7环境搭建---Java环境变量
  5. LoRa、蓝牙、技术在电子显示牌上的应用
  6. 7.Jenkins 权威指南 --- 分布式构建
  7. 强人工智能:抑制神经元的意义
  8. android弹幕控件,可能是目前轻量级弹幕控件中功能最强大的一款
  9. 机器学习实战---入门篇
  10. 谷歌插件安装(不翻墙方式)
  11. global value supply chain白皮书
  12. 融云对接php,谈谈微信小程序中首次对接融云WebIM SDK经验
  13. 90后薪资5年翻10倍,靠的不是钢琴手,而是真家伙!
  14. Mac BERT 论文解读 Revisiting Pre-trained Models for Chinese Natural Language Processing
  15. HTML5期末大作业:淘宝网站设计——仿2018淘宝首页(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  16. python蓝桥杯从入门到~
  17. 发自肺腑深入肌肤 —— 一位武汉老程序员的自白
  18. 什么是缓存雪崩、缓存击穿、缓存穿透
  19. 详细的“BP神经网络数据分类—语音特征信号分类”代码
  20. 2011年的赢家和输家

热门文章

  1. isNotEmpty和isNotBlank区别
  2. 五行代码实现千万类别分类网络,飞桨大规模分类库揭秘
  3. 电脑拓展触摸屏时,在触摸屏操作,相应的不是触摸屏
  4. 【毕业设计】基于STM32的天气预报盒子 - 嵌入式 单片机 物联网
  5. NodeJS内存溢出解决办法
  6. 基于Java+MySQL实现燃气管进销存管理系统【100010498】
  7. 狂神redis课程笔记
  8. 什么是蓝宝石玻璃屏幕?
  9. feign常用俩种降级方式Fallback和FallbackFactory。
  10. 如何用project 做出漂亮的进度计划表,有哪些功能可以用?