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

c++ why cascade shared object linkage

本文关键字:对象 链接 共享 级联 为什么 C++      更新时间:2023-10-16

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

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

我知道libctest.so的链接是使编译标志-lctest工作,但是libctest.so.1有什么意义?

我认为您以与通常显示方式相反的顺序编写了 filnames,您将有 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.0,嵌入到这个库中的是SONAME,一个库的逻辑名称,例如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

这支持在系统上安装多个不兼容版本的库,如果不同的可执行文件需要该库的不同版本。

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