【问题标题】:Vala: Compile for a lower GTK versionVala:为较低的 GTK 版本编译
【发布时间】:2023-03-23 10:10:01
【问题描述】:

我的电脑运行的是 Ubuntu 17.10 并且有 GTK+ 3.22。

从该环境编译时,二进制文件无法在 Ubuntu 16.04 下运行,因为只有 GTK+ 3.18 与 Ubuntu 16.04 兼容。如何针对较低的 GTK 运行时级别进行编译?

【问题讨论】:

    标签: gtk gtk3 vala


    【解决方案1】:

    相反的方式应该可以工作。

    在较旧的操作系统版本上编译二进制文件,它应该可以在较新的操作系统上正常工作。

    通常的解决方案是根本不提供二进制文件,而是让用户和发行版开发人员/打包人员处理问题。

    只要确保您的应用易于编译,这意味着使用标准构建系统工具,例如 mesonbuild,并在 README.md 文件中添加一些构建指令。

    【讨论】:

    • 我不同意。 ABI 在 GTK+ 的次要版本之间没有变化,因此您可以使用 3.22 构建和链接并在 3.18 上使用,前提是您在代码中不使用 3.18 之后引入的符号。
    • 是的,GTK+ ABI 不应在次要版本中更改,但没有技术上的有力保证它会起作用。还有其他图书馆呢?使用发行版 Y 创建应该在发行版 X(或发行版 X)上工作的二进制文件并不是正确的方法。这在 Android 或 Windows 上完全不同,其中有一组保证永远不会更改的精选库。警告:您始终必须确保不会意外使用较新的 API 函数。
    • 没有技术上的有力保证可以工作? OP抱怨the binaries cannor be run。好吧,如果 ABI 没有改变,你至少有这个保证:它会运行。它可能会崩溃,因为这是一个未经测试的环境,具有不同的库版本组合,您可能会遇到特定的错误,但可以修复。但是,它仍然应该运行。甚至发行版在他们的周期中都有“大规模重建”,但即使没有这个东西也是可用的。
    • 有几种方法可以实现这一点:在带有 16.04 的 VM 中编译,在 Launchpad 上设置 PPA 并让它为 16.04 构建 debs,或者只是在您的计算机上运行 16.04。
    【解决方案2】:

    这取决于您对 GTK+ API 的真正依赖。

    每个函数在其文档的末尾都有一个Since: 字段,用于说明它首次出现的 GTK+ 版本。您的两个目标版本都是 GTK+ 3,因此它们与 ABI 兼容。因此,您只需检查在 3.18 上运行为 3.22 编译的二进制文件时未找到哪些符号。在 3.18 之后添加了每个未找到的符号。 Since: > 3.18 的每个符号都不能使用,你需要使用最小的公分母。一旦识别出 > 3.18 的符号,您有 2 个选择:

    • 要么按照 3.18 的方式进行,要么将代码更改为不使用 3.18 之后引入的符号。这意味着您可能必须使用已弃用的符号,但它们会一直保留到下一次 API 中断(即 GTK+ 4)。
    • 或尝试从两个版本中获取最新功能,使用类似的方法:

    .

    #if GTK_CHECK_VERSION(3, 20, 0)
        // Do it the GTK+ >= 3.20 way
    #else
        // Do it the GTK 3.18 way
        // (and ensure you have checks in your configure.ac or similar to make
        // sure configuration breaks if trying to build with a GTK+ < 3.18)
    #endif
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      相关资源
      最近更新 更多