文章插图
在linux环境下编程,我们如果想要使用第三方的库,基本上有以下几种方式 。
1、将第三方库的源码合并到我们的工程项目代码中,一起编译 。
2、将第三方库编译成静态库(xxx.a),我们在使用时,在Makefile中引用该静态库 。
3、将第三方库编译成动态库(xxx.so), 我们在使用时,隐性调用该动态库,具体表现为需要 在程序中包含动态库的 头文件,同时需要在/usr/lib路径下,存放动态库文件,以便程序调用 。
【dlopen Linux下动态库的显性调用和隐性调用区别】4、将第三方库编译成动态库(xxx.so),我们在使用时,显性调用该动态库,在程序中,不需要包含动态库的头文件,使用 dlopen、dlsym等接口函数调用该动态库 。
在上述四种方式中:
第 1 和 2 种,本质上是一样的,使用静态库,编译时,会将静态库的内容合并到工程代码中,唯一区别的是当我们拿不到第三方库的源码时,可以直接使用静态库,相当于使用一个黑盒子,静态库提供接口 。
第 3 和 4 种方式,我们常用的是第3种方式,也就是隐性调用,但是显性调用一种程序插件的概念,随用随加载,不用不加载 。
显性调用和隐性调用区别名称使用方式动态库文件内存其他隐性调用引用动态库头文件需要提前拷贝到/usr/lib/目录,否则程序无法执行程序开始执行,不管是否用到动态库功能,都会将动态库读到内存中不会额外调用插件库显性调用不需要引用动态库头文件,但是需要引用不一定,如果程序不会执行到动态库功能,则不需要拷贝,即便使用,也可以使用绝对路径来使用,不需要拷贝到/usr/lib/目录下只有程序执行到dlopen时,才会将动态库读入内存会额外调用linux插件库,来支持显性调用 。
在使用dlopen时,编译时候要加入 -ldl (指定dl库),若dl库有问题,那么在运行时调用dlopen时会出现段错误 。因此要保证dl库没问题 。
开发时遇到一个问题,本地需要编写一个so库给应用程序提供接口,在应用程序中使用dlopen来打开so库,但是运行时调用dlopen时出现段错误 。
原因是应用程序编译时引用应用程序中lib下的dl库,该库有问题导致运行时出现段错误 。解决方式就是把应用程序中lib下的dl库给替换掉 。
小结显性调用更多的是体现在“插件”的思想,使用起来更加灵活,比如大的工程项目中,同样一套代码,提供不一样的功能时,为了节省内存、磁盘容量,可以按需加载 。在使用方式上,显性调用相比隐性调用,略复杂,需要增加额外的转换代码,而隐性调用,只需要包含动态库头文件,在代码中,直接调用API即可 。在生产程序中,如果对内存或磁盘、启动速度没有严苛的要求,尽量使用隐形调用,方便程序编写和维护 。
推荐阅读
- 如何在 Linux 中使用旧相机作为网络摄像头
- 谭松韵|《归路》收视下跌,谭松韵状态引热议,网友:一直在吃娃娃脸老本
- 鲫鱼|春季钓浅滩,9成鲫鱼在5种浅水,找准位置下竿就上鱼
- 翡翠手镯|传统老翡翠手镯的十大拍卖记录
- 男神|《偷偷藏不住》的故事线,少女暗恋7年终于拿下男神
- 丁程鑫|《你好星期六》下期要火!两对荧幕CP现场PK,丁程鑫状态令人担忧
- 戚薇|戚薇林子君的陈年往事再次冲上热搜,恳请网友们手下留情吧
- 新型冠状肺炎|潘石屹捞金捐哈弗6亿,国内疫情却一毛不拔,如今儿子酿下大祸!
- 穿衣搭配|敲开数据之门,探索灵活就业市场下的年轻人都在尝试哪些新岗位?
- 杨受成|请来半个香港娱乐圈,背后老板什么来头,名下坐拥7家上市公司