我正在为linuxtouchpad.org的触摸屏黑客编写文档,并试图解释哪个debian包对libinput具有构建依赖关系(即是sudo apt build-dep libinput还是sudo apt build-dep libinput10?)
为什么我们甚至有一个libinput10?我在libinput5 debian发行版中看到了一个旧的jessie deb包的证据。为什么libinputX在其他libinput包(如libinput-bin和libinput-dev)没有版本的情况下得到了版本改进?
libinput源代码库本身的最新版本是1.19.2,它似乎与"5“或"10”后缀无关。
发布于 2021-12-02 16:36:13
Debian (dpkg)使用的打包工具不支持同时安装同一软件包的多个版本。因此,要安装同一软件的多个版本,每个版本必须在一个具有不同名称的包中。
必须可以安装同一共享库的多个版本,因为使用该库的不同程序是针对该库的不同版本构建的。即使在给定的时间点上,所有使用libinput的程序都是针对版本10构建的,但这并不是永远正确的。当版本11发布时,必须能够在版本10的同时安装它,因为并不是所有使用该库的程序都会立即重建。
这个约束不适用于大多数不是共享库的包。没有理由同时安装不同版本的/lib/udev/libinput*,因此不需要安装多个版本的libinput-bin。如果您想要为多个版本的libinput-dev构建程序的二进制文件,那么只需要同时安装多个版本的libinput,而这不是Debian试图通过其打包支持的。
由于库包需要在库以不兼容的方式更改时进行更改,因此Debian将库包名称的约定定义为库的名称,然后定义一个数字,当库发生更改时,旧的二进制文件无法使用新的库。换句话说,库包版本号必须在ABI更改时更改。
根据上游版本编号约定,ABI更改可能与库版本号中的模式相对应,也可能不对应。有一个非常普遍的(但不是通用的)约定,当API接口以不兼容的方式变化时,主版本号会发生变化,而API的更改几乎总是意味着ABI的更改,但许多ABI更改并不涉及不兼容的API更改。如果是由于另一个库中的更改,ABI甚至可以在不改变库的情况下进行更改。
库文件本身包含一个名称,当库以不兼容的方式更改时,名称将更改: 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]当ABI以不兼容的方式变化时,.10部件会发生变化。当ABI以向后兼容的方式变化时,.13.0部件会发生变化。
有关更多信息,请参见:
https://unix.stackexchange.com/questions/679906
复制相似问题