Linux 可容纳共享库的多个版本,但包含的内容呢?

Linux accommodates multiple versions of a shared library but what about includes?

我正在尝试了解如何在 Linux 下管理共享库版本,以及在配置和编译程序时这些版本如何与不同版本的包含文件交互。

我知道一个系统可以有多个版本的共享库(.so 文件),文件名中 libxxx.so 后的第一个版本号不同,不同的程序可能 link使用同一库的不同版本编辑。库的新版本(.so.# 已更改)通常与以前的版本不兼容。 (第一个之后的版本号是不影响其兼容性的次要库更改)。

如果我正在编译(或重新编译)一个用旧版本库 link 编辑的旧程序,并且如果我的系统上同时有旧库和新库,似乎没有管理与每个库版本关联的包含文件的多个版本的机制。因此,即使我有旧版本的库可用,但没有旧版本的包含文件到 link,我真的无法重新编译该程序。是真的吗?

如果是这样,那么支持多个库版本的价值似乎值得怀疑。这个想法必须是旧版本库的唯一用户是在旧版本是当前版本时编译的程序,并且任何程序都不应该被重新编译,除非它 link 所具有的所有库的所有版本都是系统上安装的这些库的最新版本。一旦安装了新版本的库,所有使用旧版本的程序都无法再编译(除非使用新库更新到新版本)。对吗?

或者,人们通常会为安装的每个库的每个版本保留一个单独的包含文件子目录,以便可以使用适当的包含文件和库版本重新编译程序吗?

Include-files 与共享库的处理方式不同:

  • 有了共享库,开发包在linking时会有一个名字供开发包使用,这是一个符号link 到具有特定 soname(名称加版本)的文件。在 linking 之后,程序会引用 文件 ,只要 运行 程序就会使用它。

  • Include-files可以通过include-paths的-I选项来区分。当一个库有多个有用的版本时,一些开发人员可能会使用不同的目录名称来打包版本以保存相关的header文件。这样,在编译时仅更改 -I 选项可使构建脚本能够与特定版本的 header 一起使用。但与共享库不同的是,header 文件仅在 构建 使用库的程序时使用。