0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux下动态链接库管理方式

冬至子 来源:技术铺子 作者:chasenzhang 2023-01-18 12:35 次阅读

由一个问题谈起,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。

$ ldd /bin/bash
  linux-vdso.so.1 (0x00007ffedb129000)
  libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f135ae6b000)
  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f135ac43000)
  /lib64/ld-linux-x86-64.so.2 (0x00007f135b018000)

第二个例子,再比如OpenCV的so,可以看到,libopencv_aruco.so是libopencv_aruco.so.4.5的软链接,libopencv_aruco.so.4.5是libopencv_aruco.so.4.5.4的软链接,为什么会这样设计呢?

$ ls -alh libopencv_*
lrwxrwxrwx 1 root root   22  9月 16 00:41 libopencv_aruco.so -> libopencv_aruco.so.4.5
lrwxrwxrwx 1 root root   24  9月 16 00:41 libopencv_aruco.so.4.5 -> libopencv_aruco.so.4.5.4
-rw-r--r-- 1 root root 428K  9月 16 00:41 libopencv_aruco.so.4.5.4
lrwxrwxrwx 1 root root   24  9月 16 00:41 libopencv_barcode.so -> libopencv_barcode.so.4.5
lrwxrwxrwx 1 root root   26  9月 16 00:41 libopencv_barcode.so.4.5 -> libopencv_barcode.so.4.5.4
-rw-r--r-- 1 root root 124K  9月 16 00:41 libopencv_barcode.so.4.5.4
lrwxrwxrwx 1 root root   23  9月 16 00:41 libopencv_bgsegm.so -> libopencv_bgsegm.so.4.5
lrwxrwxrwx 1 root root   25  9月 16 00:41 libopencv_bgsegm.so.4.5 -> libopencv_bgsegm.so.4.5.4

其实这是linux下的动态库的版本管理方式引起的,这篇文章简单讨论下。根据网上查的资料,linux下的动态链接库有下面三种:

第一个,real name,字如其名意思就是链接的真实的so名字,一般形式为:libname.so.x.y.z,具体的解释引用链接的解释

x是主版本号(Major Version Number),y是次版本号(Minor Version Number),z是发布版本号(Release Version Number), 并且它们具有以下要求。

主版本号(不兼容):重大升级,不同主版本的库之间的库是不兼容的,所以如果要保证向后兼容就不能删除旧的动态库的版本。

次版本号(向下兼容): 增量升级,增加一些新的接口但保留原有接口,高次版本号的库向后兼容低次版本号的库。

发布版本号(相互兼容):库的一些诸如错误修改、性能改进等,不添加新接口,也不更改接口,主版本号和次版本号相同的前提下,不同发布版本之间完全兼容。

第二个,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的方法, 如下命令

# 设置soname参数
$ g++ -fPIC b.cpp -shared -Wl,-soname,libtest.so.1 -o libtest.so.1.0
# 查看so是否有soname
$ readelf -d libtest.so.1.0 | grep SONAME
0x000000000000000e (SONAME)             Library soname: [libtest.so.1]

第三个,link name,就是用gcc或者g++编译的时候,-l指定的so名字,比如说下面例子的-ltest

g++ main.cpp -L. -ltest

上面介绍了三类so,那么我们再来看下他们之间的关系,以及编译器如何链接的。假如我们编译一个OpenCV的程序,编译命令

# 编译出可执行文件 a.out
$ g++ main.cpp -o a.out -I /usr/local/include/opencv4/ -L /usr/local/lib \\
  -lopencv_core -lopencv_videoio \\
  -lopencv_imgproc -lopencv_objdetect -lopencv_highgui


# 查看a.out的OpenCV依赖
$ ldd a.out | grep opencv
  libopencv_core.so.4.5 => /usr/local/lib/libopencv_core.so.4.5 (0x00007fe5d629c000)
  ......
# 查看opencv_core.so.4.5.4的soname
$ readelf -d /usr/local/lib/libopencv_core.so.4.5.4 | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libopencv_core.so.4.5]

以opencv_core.so为例,core.so的软链接是这样的

libopencv_core->libopencv_core.4.5->libopencv_core4.5.4

编译阶段,编译的时候制定链接的so,-lopencv_core.so(link name),链接的时候会根据软链接关系找到libopencv_core4.5.4,读取soname写入到可执行文件中。

运行时候,链接器读取可执行文件的soname,就是libopencv_core.4.5,再根据软链接的关系,最终找到libopencv_core4.5.4(real name)

如果使用了这种动态库管理方式,以OpenCV为例,如果小版本升级,比如说4.5.4要升级到4.5.5,可以直接把libopencv_core.so.4.5重新指向libopencv_core.so.4.5.5,不需要重新编译库。如果大版本升级,因为大版本的接口可能不兼容,所以大版本升级要重新编译。

如果一些比较简单的so,可以不用soname这种机制,直接编译出libtest.so链接上,这样做事很方便,但是缺点是看不出版本的信息

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenCV
    +关注

    关注

    31

    文章

    634

    浏览量

    41338
  • LINUX内核
    +关注

    关注

    1

    文章

    316

    浏览量

    21644
  • gcc编译器
    +关注

    关注

    0

    文章

    78

    浏览量

    3380
收藏 人收藏

    评论

    相关推荐

    Linux动态链接库的基本概念

    学习Linux动态链接库是一个绕不开的话题,我们今天就一起来看一什么是动态链接库
    发表于 09-27 14:31 1544次阅读

    关于使用动态链接库及图像采集的问题

    我用的是方诚科技的工业相机,里面提供了一些动态链接库,包括了相机初始化,采集图像,颜色处理等函数,我以前都是用VB做的,买相机的时候他会提供VB的模块,所以用VB比较方便。现在我想用LABVIEW做
    发表于 05-26 18:05

    labview调用动态链接库问题

    本帖最后由 ZHZJK 于 2014-7-15 11:07 编辑 本人使用动态链接库一直没成功过,这次准备调用读卡器的dll来读卡用了其中 打开串口 和读取卡号 两函数总是有错希望大家帮忙看看
    发表于 07-15 11:01

    LabVIEW之动态链接库

    问一大家,如何利用动态链接库调用LabVIEW官方不支持的摄像头?求高手指教!
    发表于 03-13 09:59

    关于labview'的动态链接库的问题

    最近使用labview调用动态链接库,使用vs2017生成dll文件,然后调用,但是为什么输入数组的情况输出一直为0呢,我使用公式节点调用同样的c语言,就没问题?请教大佬们怎么解决?还有我想问一
    发表于 03-14 11:26

    基于动态链接库技术的感应器非线性特性校正

    提出一种基于动态链接库技术的传感器非线性特性校正新方法。将传感器是数据采集程序与传感器的非线性特性校正算法置于同一个动态链接库中,这样应用程序从动态
    发表于 06-25 09:55 26次下载

    C++中动态链接库的创建和调用

    动态连接的创建步骤: 一、创建Non-MFC DLL动态链接库 1、打开File —> New —> Project选项,选择Win32 Dynamic-Link Library
    发表于 11-24 18:13 7次下载

    LINUX环境CLIPS动态链接库的实现方法

    LINUX环境,为了简便、快捷地制作出CLIPS动态链接库,本文采用了CNU AUTOTOOLS把CLIPS嵌入式高级语言编译成动态
    发表于 04-14 21:18 30次下载

    虚拟仪器中动态链接库的应用

    本文在阐述了动态链接库技术和虚拟仪器中的 动态链接 机制的基础上,详述了基于DLL的USB接口虚拟仪器的设计的关键内容。
    发表于 07-05 17:17 27次下载
    虚拟仪器中<b class='flag-5'>动态</b><b class='flag-5'>链接库</b>的应用

    VC++动态链接库编程深入浅出

    静态链接库动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若
    发表于 10-21 17:03 0次下载
    VC++<b class='flag-5'>动态</b><b class='flag-5'>链接库</b>编程深入浅出

    由MATLAB的.m文件生成动态链接库的方法说明

    由MATLAB的.m文件生成动态链接库的方法说明
    发表于 08-16 18:54 0次下载

    英创信息技术WinCE设备动态链接库的制作与调用

    在使用英创ARM9系列主板做开发时,用户可能希望将自己一部分代码封装起来,隐藏代码的实现过程,只提供接口供其他程序调用。使用动态链接库(Dynamic Link Library)可以很好实现这个要求
    的头像 发表于 01-15 14:33 1142次阅读
    英创信息技术WinCE设备<b class='flag-5'>动态</b><b class='flag-5'>链接库</b>的制作与调用

    单片机高阶技能之动态链接库技术实现

    单片机高阶技能之动态链接库技术实现
    发表于 11-17 12:21 13次下载
    单片机高阶技能之<b class='flag-5'>动态</b><b class='flag-5'>链接库</b>技术实现

    Linux的静态链接库动态链接库的区别是什么?

    学习Linux动态链接库是一个绕不开的话题,我们今天就一起来看一什么是动态链接库
    的头像 发表于 02-17 10:49 1269次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>的静态<b class='flag-5'>链接库</b>和<b class='flag-5'>动态</b><b class='flag-5'>链接库</b>的区别是什么?

    深入探讨Linux系统中的动态链接库机制

    本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。 引言 在软件开发过程中,动态
    的头像 发表于 12-18 10:06 77次阅读
    深入探讨<b class='flag-5'>Linux</b>系统中的<b class='flag-5'>动态</b><b class='flag-5'>链接库</b>机制