Linux学习(7)——依赖库
发布时间:2022-10-24 12:52:00 所属栏目:Linux 来源:
导读: 最近在和其他人对接一些工程时,运行这些工程时会发现需要一些依赖库,例如需要一些opencv这些需要安装的库。如果所给的工程中没有链接好这些库,那就需要运行这个工程的系统里安装所需要的库。在这个过程中,我
最近在和其他人对接一些工程时,运行这些工程时会发现需要一些依赖库,例如需要一些opencv这些需要安装的库。如果所给的工程中没有链接好这些库,那就需要运行这个工程的系统里安装所需要的库。在这个过程中,我学习到了一些知识。 1. ldd命令查看依赖库 ldd用于打印程序或者库文件所依赖的共享库列表 (1)语法 ldd(选项)(参数) (2)选项 --version:打印指令版本号; -v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; -d:执行重定位和报告任何丢失的对象; -r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数; --help:显示帮助信息。 (3)参数 文件:指定可执行程序或者文库。 (4)原理 ldd显示可执行模块的dependency(所属)的工作原理是通过ld-linux.so(elf动态库的装载器)来实现的。ld-linux.so模块会先于executable模块程序工作linux动态库,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency(所属)。实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program) 2.动态链接库 在查看依赖库时,我第一次发现了.so文件,同事说这是动态链接库文件。Linux下的动态链接称之为共享目标文件(Shared Object),文件后缀为.so。那么动态库有什么好处呢?那就需要和静态库进行比较: · 静态库:会合入到最终生成的程序,使得结果文件比较大。优点是不再有任何依赖。 · 动态库,一个文件可以多个代码同时使用内存中只有一份,节省内存,可以随主代码一起编译。 静态链接在链接的时候,就把所依赖的第三方库函数都打包到了一起,导致最终的可执行文件非常大。而动态链接在链接的时候并不将那些库文件直接拿过来,而是在运行时,发现用到某些库中的某些函数时,再从这些第三方库中读取自己所需的方法。 我们把编译后但是还未链接的二进制机器码文件称为目标文件(Object File),那些第三方库是其他人编译打包好的目标文件,这些库里面包含了一些函数,我们可以直接调用而不用自己动手写一遍。在编译构建自己的可执行文件时,使用静态链接的方式,其实就是将所需的静态库与目标文件打包到一起。最终的可执行文件除了有自己的程序外,还包含了这些第三方的静态库,可执行文件比较臃肿。相比而言,动态链接不将所有的第三方库都打包到最终的可执行文件上,而是只记录用到了哪些动态链接库,在运行时才将那些第三方库装载(Load)进来。 有关动态链接库的原理,可以参看网站[2],写得特别详细。 (编辑:开发网_新乡站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐