Linux动态库管理
Linux 动态库版本管理
一文读懂Linux下动态链接库版本管理及查找加载方式
由一个问题谈起
linux下的动态链接库的名字后缀是so,但是我们有时候也会遇到下面的报错
./a.out: error
参考链接 Linux 动态库版本管理 一文读懂Linux下动态链接库版本管理及查找加载方式 由一个问题谈起 linux下的动态链接库的名字后缀是so,但是我们有时候也会遇到下面的报错 ./a.out: error while loading shared libraries: libtest.so.1: cannot open shared object file: No such file or directory 动态链接库的后缀不是so吗?怎么会提示链接不到libtest.so.1呢? 再看第一个例子,在linux下查看下bash的依赖库,可以发现bash依赖的动态库是libxxx.so.x的,不是常见的libxxx.so。
第二个例子,再比如OpenCV的so,可以看到,libopencv_aruco.so是libopencv_aruco.so.4.5的软链接,libopencv_aruco.so.4.5是libopencv_aruco.so.4.5.4的软链接,为什么会这样设计呢?
其实这是linux下的动态库的版本管理方式引起的,这篇文章简单讨论下。 linux下的动态库管理 根据网上查的资料,linux下的动态链接库有下面三种: real name real name,字如其名意思就是链接的真实的so名字,一般形式为:libname.so.x.y.z,具体的解释引用链接的解释 x是主版本号(Major Version Number)linux动态库,y是次版本号(Minor Version Number),z是发布版本号(Release Version Number), 并且它们具有以下要求。 soname soname就是linux版本管理的重要机制了。在编译动态链接库的时候,可以设置一个soname参数(通过-Wl,-soname设置),通过这个参数,编译器在链接的时候会根据这个SONAME去找对应的动态库。以库的形式如下libtest.so.x.y.z来举例,如果两个库可以兼容,,那么他们的x是一样的,比如说libtest.so.1.0.0、libtest.so.1.0.1、libtest.so.1.1.1它们三个动态库是互相兼容的,而libtest.so.1.0.0、libtest.so.2.0.1则是不兼容的。 设置soname的方式以及查看某个库是否设置soname的方法, 如下命令
link name link name,就是用gcc或者g++编译的时候,-l指定的so名字,比如说下面例子的-ltest
三个so的关系 上面介绍了三类so,那么我们再来看下他们之间的关系,以及编译器如何链接的 假如我们编译一个OpenCV的程序,编译命令
以opencv_core.so为例,core.so的软链接是这样的 libopencv_core->libopencv_core.4.5->libopencv_core4.5.4 这种方式的优势 如果使用了这种动态库管理方式,以OpenCV为例,如果小版本升级,比如说4.5.4要升级到4.5.5,可以直接把libopencv_core.so.4.5重新指向libopencv_core.so.4.5.5,不需要重新编译库。如果大版本升级,因为大版本的接口可能不兼容,所以大版本升级要重新编译。 如果一些比较简单的so,可以不用soname这种机制,直接编译出libtest.so链接上,这样做事很方便,但是缺点是看不出版本的信息。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |