为什么libinput打包为libinput10?

为什么libinput打包为libinput10?

我正在 linuxtouchpad.org 上为触摸板黑客编写文档,并且我试图解释哪个 debian 软件包具有 libinput 的构建依赖项(即是它sudo apt build-dep libinput还是sudo apt build-dep libinput10?)

为什么我们甚至有一个libinput10?我在Debian 发行版中看到了旧的libinput5deb 软件包的证据。jessie为什么 libinputX获得了版本提升,而其他 libinput 软件包(例如libinput-binlibinput-dev)却没有?

libinput源库本身的最新版本1.19.2似乎与“5”或“10”后缀无关。

答案1

Debian 使用的打包工具(dpkg)不支持同时安装同一软件包的多个版本。因此,要安装同一软件的多个版本,每个版本必须位于具有不同名称的包中。

必须可以安装同一共享库的多个版本,因为使用该库的不同程序是针对该库的不同版本构建的。即使在给定的时间点,所有使用 libinput 的程序都是针对版本 10 构建的,但这也不会永远如此。当版本 11 发布时,必须可以将其与版本 10 一起安装,因为并非所有使用该库的程序都会立即重建。

此限制不适用于大多数非共享库的包。没有理由/lib/udev/libinput*同时安装不同版本的软件,因此没有必要安装多个版本的软件libinput-bin。如果您想为多个版本的 构建程序的二进制文件,则只需要libinput-dev同时安装多个版本的libinput,而 Debian 并没有尝试通过其打包来支持这一点。

由于每当库以不兼容的方式更改时,库包都需要更改,因此 Debian 将库包名称的约定定义为库的名称,后跟一个数字,每当库以旧的二进制文件无法更改的方式更改时,该数字就会更改不要使用新库。换句话说,无论什么时候,库包版本号都必须改变。ABI变化。

根据上游的版本编号约定,ABI 更改可能会或可能不会对应于库版本号中的模式。有一个非常广泛(但不是通用)的约定,即主版本号在应用程序编程接口以不兼容的方式进行更改,API 更改几乎总是意味着 ABI 更改,但许多 ABI 更改并不涉及不兼容的 API 更改。如果是由于另一个库的更改而导致 ABI 发生更改,而库中没有任何更改,则甚至有可能发生更改。

库文件本身包含一个名称,当库以不兼容的方式更改时,该名称也会更改:soname。这个唯一的名称是动态加载器选择正确版本的方式。虽然这不是强制性的,但大多数库都使用以下形式的 soname,libfoo.so.N其中 N 是一个整数,每次 ABI 以不兼容的方式更改时该整数都会更改。 Debian 上的 Libinput 遵循此约定,当前 N 值为 10。

$ readelf -d /usr/lib/x86_64-linux-gnu/libinput.so.10.13.0 | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libinput.so.10]

.10当 ABI 以不兼容的方式更改时,该部分会发生更改。.13.0当 ABI 以向后兼容的方式发生变化时,该部分也会发生变化。

有关更多信息,请参阅:

相关内容