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

标签 c++ shared-libraries

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

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

我知道 libctest.so 的链接是让编译标志 -lctest 起作用,但是 libctest.so.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.0 ,嵌入到这个库中的是 SONAME ,库的逻辑名称,例如libctest.so.1,也用作实际文件的符号链接(symbolic link)。

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

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

这样,当 libctest 升级时,链接到 libctest.so.1 的可执行文件(或其他库)可以保持不变。因此,当 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

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

关于c++为什么级联共享对象链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45856152/

相关文章:

Jenkins 管道共享库与插件

c - 库插入 nanosleep

Android 链接 .so 用于命令行可执行文件?

c++ - 如何在 C/C++ 中收到文件/目录更改的通知,最好使用 POSIX

c++ - 调用 cvSet2D() 设置图像的像素值返回值 0

C++ 从基类继承构造函数

jenkins - 事件选择参数中的通用 Groovy 脚本

c++ - 禁止在 C++ 中复制类

c++ int 数组 - 删除一个 int 并移动数组的其余部分

macos - 如何在Mac OSX下使用gcc设置可执行文件的运行时路径(-rpath)?