Ubuntu 在跨版本的二进制兼容性方面提供了哪些保证?

Mat*_*ron 7 upgrade compatibility versions binary

我通常知道答案是“使用 PPA”,但与此分开......

对于给定的体系结构,Ubuntu 版本之间的兼容性的 Ubuntu 政策是什么?例如,如果包中的二进制文件是在 10.04 LTS 上构建的,并且相同的库存在于 Ubuntu 12.04 LTS 中,那么 Ubuntu 是否保证兼容性?是否有针对 ISV 的指南?

我确实搜索了很多,并找到了有关 LSB、其他发行版等兼容性的参考资料。我没有找到描述跨 Ubuntu 发行版的文档。

And*_*ini 6

使二进制包与库不兼容的原因是 API 或 ABI 中断。

  • 一个API休息时,由图书馆提供的接口的方式,不再与以前的版本兼容的改变发生。一个例子是从方法签名中添加或删除参数。

    API 中断通常要求您使软件适应新界面,并且库开发人员会尽可能避免。

  • ABI断裂发生时的大小或数据类型变化的取向,或低级约定(诸如调用约定)的变化。一个示例是将函数的参数类型从 修改intsize_t。ABI 中断通常仅由错误修复或 API 更改引入。

    ABI 中断需要您使用最新的库头文件重新编译您的程序。

话虽如此,关于 API 和 ABI 中断的 Ubuntu 政策是什么?

  • 较新的 Ubuntu 版本试图始终提供最新的软件,包括最新的软件库。

  • 较新的 Ubuntu 版本尝试尽可能向后兼容。例如,Ubuntu 同时提供 GTK+2 和 GTK+3。

  • 一旦发布了 Ubuntu 版本,它就会被冻结,因为只有重要的错误修复才能到达该版本的存档(此规则有例外和特殊情况,但此类例外仅限于一小部分应用程序)。

  • 在单个 Ubuntu 版本的更新中,API 不会中断。“仅错误修正”政策暗示了这一点。

  • 正如我之前所说,一些错误修正可能会导致 ABI 中断。虽然这是一种罕见的情况,但这是可能的,如果 ABI 中断是修复重要错误所必需的,它将被引入。

  • 在 Ubuntu 主要版本中,可能会引入 API 和 ABI 中断。这是因为总是试图提供最新的软件。

长话短说:您的程序是否可以跨 Ubuntu 版本运行实际上取决于它使用的库和围绕它们的策略。此外,您无法确定您的软件包是否与 Ubuntu 版本更新兼容。

那是技术含量最高的部分。说完这个重要的前言,我们可以从不同的角度来解决这个问题:考虑到1.存在许多标准,2.自由软件试图尽可能地尊重这些标准,以及3.大多数库(即使是小的和不重要的库) ) 不太可能跨版本更改其 API/ABI。

因此,您可以随意为多个 Ubuntu 版本提供一个二进制包,但请留意更新日志。另外,记住要清楚你的包依赖:例如,不要说它依赖于 GTK+3,但要明确说明范围(从 3.X 到 3.Y)。这将帮助您的用户防止出现严重错误。


Lui*_*ado 1

我可能有点偏离,但让我说一下我对此所知甚少。nvidia-313我将使用带有版本的包作为示例313.18-0ubuntu1~xedgers~raring2

在基本层面上,当为特定 Ubuntu 版本创建包时,它包含:

  • 它所针对的架构(例如:32 位、64 位)
  • 它是为哪个版本制作的(例如:12.04、12.10、raring、oneric..)
  • 该软件包的具体版本是什么(在上面的示例中,您可以看到 raring2,这意味着如果从 0 开始,则为第三个版本;如果从 1 开始,则为第二个版本。这当然取决于我使用的 PPA 以及什么)维护者想到的)

这一切保证了什么。它保证:

  1. 该软件包将在特定的 Ubuntu 版本和特定的架构下“正确”工作。这是假设包可能使用的库没有在干净的环境中手动更改或以其他方式篡改。

  2. 该包将知道它是什么架构和版本。如果它被用在另一个不同的地方,它会给你一个警告或者干脆安装失败。

  3. 大多数 PPA 开发人员和 Ubuntu 的主要存储库都会有一个软件包版本。它可能是相同的版本(例如 Nvidia 313 for 13.04、12.10、12.04...),但在打包时,它使用了一些其他包的特定版本(依赖项或预依赖项)以及某些库的特定版本该版本的 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 中,这将消除例如使用 less 库的需要(就像一个打包在 10.04 中使用了 12 个库,但在 12.04 中只需要 2 个库即可完成相同的目标)。这还考虑到了对编译和打包每个应用程序的工具所做的更改。每年都会出现许多新技术,许多优化包、压缩包、读取包的方法等等。

因此,根据我的一点知识,我猜测,不同版本的 Ubuntu 上的软件包之间存在的时间越长,该软件包在两个 Ubuntu 版本之间运行的可能性就越小。