我知道一般答案是“使用 PPA”,但与此不同......
对于给定架构的 Ubuntu 版本之间的兼容性,Ubuntu 的政策是什么?例如,如果软件包中的二进制文件是基于 10.04 LTS 构建的,而相同的库也存在于 Ubuntu 12.04 LTS 中,Ubuntu 是否保证兼容性?是否有针对 ISV 的指南?
我确实搜索了很多,找到了关于与 LSB、其他发行版等的兼容性的参考资料。但我没有找到描述跨 Ubuntu 发行版本的文档。
答案1
二进制包与库不兼容的原因是 API 或 ABI 中断。
一个API 中断当库提供的接口发生更改,不再与以前的版本兼容时,就会发生这种情况。例如,在方法签名中添加或删除参数。
API 中断通常需要您使软件适应新的界面,库开发人员会尽可能避免这种情况。
一个ABI 中断当数据类型的大小或对齐方式发生变化,或者低级约定(如调用约定)发生变化时,就会发生这种情况。一个例子是将函数的参数类型从 修改为
int
。ABIsize_t
中断通常是由错误修复或 API 更改引起的。ABI 中断要求您使用最新的库头重新编译您的程序。
话虽如此,Ubuntu 对 API 和 ABI 中断的政策是什么?
较新的 Ubuntu 版本尝试始终提供最新的软件,包括最新的软件库。
较新的 Ubuntu 版本尽可能地向后兼容。例如,Ubuntu 同时提供 GTK+2 和 GTK+3。
一旦 Ubuntu 发行版发布,它冻结,从某种意义上说,只有重要的错误修复才能到达该版本的档案(这条规则有例外和特殊情况,但这些例外仅限于一小部分应用程序)。
在单个 Ubuntu 版本的更新中,API 不会出现中断。这是“仅修复错误”策略所暗示的。
正如我之前所说,一些错误修复可能会引入 ABI 中断。虽然这种情况很少见,但这是可能的,如果需要 ABI 中断来修复重要错误,就会引入它。
在 Ubuntu 各主要版本中,可能会引入 API 和 ABI 中断。这是因为 Ubuntu 试图始终提供最新的软件。
长话短说:你的程序是否能跨 Ubuntu 版本运行实际上取决于它使用的库以及相关政策。此外,您无法确定您的软件包是否与 Ubuntu 版本更新兼容。
这是最技术性的部分。说完这个重要的前言后,我们可以从不同的角度来解决这个问题:考虑一下1.存在许多标准,2.自由软件会尽可能地尊重标准,并且3.大多数库(即使是小型和不重要的库)也不太可能在版本之间改变其 API/ABI。
因此,您可以随意为多个 Ubuntu 版本提供单个二进制包,但请留意更新日志。此外,请记住明确说明您的包依赖关系:例如,不要说它依赖于 GTK+3,而是明确说明范围(从 3.X 到 3.Y)。这将帮助您的用户避免严重错误。
答案2
我可能有点离题,但让我说说我对此的了解。我将使用版本nvidia-313
为313.18-0ubuntu1~xedgers~raring2
在基本层面上,当为特定的 Ubuntu 版本创建包时,它包含:
- 其适用的架构(例如:32 位、64 位)
- 针对哪个版本制作的(例如:12.04、12.10、raring、oneric...)
- 该软件包的具体版本(在上面的例子中,您可以看到 raring2,这意味着如果从 0 开始,则是它的第 3 个版本;如果从 1 开始,则是第 2 个版本。这当然取决于我使用的 PPA 以及维护者的想法)
所有这些保证了什么?它保证了:
该软件包将在该特定 Ubuntu 版本和特定架构下“正确”运行。前提是软件包可能使用的库未在干净的环境中被手动更改或以其他方式篡改。
软件包会知道它适用于哪种架构。如果在另一个不同的架构中使用,它会给你一个警告或直接安装失败。
大多数 PPA 开发人员和 Ubuntu 的主要存储库都会有一个软件包版本。它可能是同一个版本(例如适用于 13.04、12.10、12.04 的 Nvidia 313...),但在打包时,它使用了一些其他软件包(依赖项或预依赖项)的特定版本以及该版本 Ubuntu 所需的某些库的特定版本。因此,在不同的 Ubuntu 版本中可以看到相同的软件包。
如果将它用于未来版本或比其原先版本更旧的版本,它能否正常工作?很可能不会。在某些情况下,它会正常工作,但至少会给您一个警告。在大多数情况下,它实际上取决于所述包的依赖关系,因为如果它使用了一些库(例如在 12.04 中),而这些库在 13.04 中没有变化或变化很小,那么这个包甚至可能在 13.04 上仍能正常工作(即使它是为 12.04 制作的),当然,假设它至少是相同的架构,以避免其他问题。
要了解您提出的具体问题:
如果包中的二进制文件是基于 10.04 LTS 构建的,并且 Ubuntu 12.04 LTS 中存在相同的库,那么 Ubuntu 是否保证兼容性?
如果 10.04 和 12.04 中都存在相同的库,并且具有相同的版本、相同的架构(以及相同的预依赖项、版本等),那么我相信该软件包将在 Ubuntu 的两个版本中工作。现在,这不太可能,因为任何 Linux 发行版在几个月内的变化速度都非常快。
许多库都发生了变化,进行了许多更新,添加了许多改进。因此,例如,10.04 中不存在的东西可能存在于 12.04 中,这将消除使用更少库的需要(例如,如果一个软件包在 10.04 中使用了 12 个库,但在 12.04 中只需要 2 个即可实现相同的目标)。这还考虑到对编译和打包每个应用程序的工具所做的更改。每年都会出现许多新技术,优化软件包、压缩软件包、读取软件包等的方法也很多。
因此,基于我所掌握的这些知识,我猜测,一个软件包在不同 Ubuntu 版本之间存在的时间越长,该软件包在两个 Ubuntu 版本之间都能正常运行的可能性就越小。