Linux 系统,也同样面临和Window一样的问题,如何控制动态库的多个版本问题.Window之前没有处理好,为此专门有个名词来形容这个问题 "Dll hell",其严重影响软件的升级和维护. Dll hell 是指windows 上动态库新版本覆盖旧版本,但是却不兼容老版本.常常发生在程序升级之后,动态库更新,原有程序运行不起来;或者装新软件,但是已有的软件运行不起来. 同样Linux操作系统,也有同样的问题,那么它是怎么解决的呢?
Linux 为解决这个问题,引入了一套机制,如果遵守这个机制来做,就可以避免这个问题. 但是这只事一个约定,不是强制的.但是建议遵守这个约定,否则同样也会出现 Linux 版的Dll hell 问题. 下面来介绍一个这个机制. 这个机制是通过文件名,来控制dll (shared library) 的版本.
Linux 上的Dll ,叫shared library,其有三个名字,分别有不同的目的.
第二个是动态库的soname( Short for shared object name),其是应用程序加载dll 时候,其寻找共享库用的文件名.其格式为
lib + math+.so + ( major version number)
其只包含major version number,换句话说,也就是只要其接口没有变,应用程序都可以用,不管你其后minor build version or build version.
问题来了,程序运行时怎么通过soname 找个real name? Soname 存在哪里?如果与real name 关联起来?什么时候存的?
这就是此时此刻呢要介绍的第三个共享库的名字,link name,顾名思义,就是在编译过程,link 阶段用的文件名. 其将sonmae 和real name 关联起来.
第三个名字,共享库的连接名(link name),是专门为build 阶段连接而用的名字.这个名字就是lib + math +.so ,比如libmath.so.其是不带任何版本信息的.在共享库编译过程中,连接(link) 阶段,编译器将生成一个共享库及real name,同时将共享库的soname,写在共享库文件里的文件头里面.可以用命令 readelf -d sharelibrary 去查看.
静态库
静态库优缺点
上面简单介绍了静态库,那它自然也会有优缺点,这里来介绍下它的优缺点.
动态库
动态库优缺点
查看某个库是否安装命令:
为了让动态链接库为系统所共享,还需运行动态链接库的管理命令 ldconfig .此执行程序存放在/sbin目录下.
ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib .so ),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
①.、往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf文件的,但是添加完后需要调用下ldconfig,不然添加的library会找不到.
参考:
①.、 linux中ldconfig命令 以及 添加动态库自动搜索路径
以上就是土嘎嘎小编为大家整理的linux安装动态库命令相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!