c ++为什么级联共享对象链接

时间:2017-08-24 08:04:13

标签: c++ shared-libraries

在我的lib目录中,我看到大多数共享对象链接都是级联的。例如:

libctest.so.1.0 -> libctest.so.1
libctest.so.1 -> libctest.so

我知道libctest.so的链接是为了让编译标记-lctest起作用,但是libctest.so.1是什么意思?

2 个答案:

答案 0 :(得分:1)

我认为你以相反的顺序编写了电影名称,通常如何显示,你会有3个文件

libctest.so.1.0  (library file)
libctest.so.1 -> libctest.so.1.0 (symlink to the libctest.so.1.0 file)
libctest.so -> libctest.so.1     (symlink to the libctest.so.1 symlink

这是一个版本控制方案。

库的特定版本/安装具有完整的文件名,例如嵌入到此库中的libctest.so.1.0SONAME,它是库的逻辑名称,例如libctest.so.1,也用作实际文件的符号链接。

链接可执行文件时,库SONAME将添加到可执行文件中,因此在运行时,可执行文件将查找libctest.so.1的文件名。惯例是让库的SONAME保持不变,只要它向后兼容,并在引入向后不兼容的ABI更改时更改它。

正如您所说,链接器将在您进行链接时查找lib*.so

这样,在libctest.so.1升级时,链接到libctest的可执行文件(或其他库)可以保持不变。因此,当libctest版本1.1发布时,您可能拥有以下文件:

libctest.so.1.1
libctest.so.1 -> libctest.so.1.1
libctest.so -> libctest.so.1

可执行文件仍然尝试定位libctest.so.1,因此在升级库时可以保持不变。必须编写库,以便向后兼容,以便在实践中工作。

如果你发布了一个新的向后不兼容的库,那么约定就是改变那个库的SONAME,所以你最终会得到例如。

libctest.so.2.0
libctest.so.2 -> libctest.so.2.0

如果不同的exeucatbles需要不同版本的库,这支持在系统上安装几个不兼容的库版本。

答案 1 :(得分:0)

这些数字都是关于版本控制的。这意味着您可以轻松地同时安装多个版本的库,并且与特定版本链接的应用程序将使用该版本(因为链接器会解析符号文件系统链接)。