【发布时间】:2023-03-23 10:10:01
【问题描述】:
我的电脑运行的是 Ubuntu 17.10 并且有 GTK+ 3.22。
从该环境编译时,二进制文件无法在 Ubuntu 16.04 下运行,因为只有 GTK+ 3.18 与 Ubuntu 16.04 兼容。如何针对较低的 GTK 运行时级别进行编译?
【问题讨论】:
我的电脑运行的是 Ubuntu 17.10 并且有 GTK+ 3.22。
从该环境编译时,二进制文件无法在 Ubuntu 16.04 下运行,因为只有 GTK+ 3.18 与 Ubuntu 16.04 兼容。如何针对较低的 GTK 运行时级别进行编译?
【问题讨论】:
相反的方式应该可以工作。
在较旧的操作系统版本上编译二进制文件,它应该可以在较新的操作系统上正常工作。
通常的解决方案是根本不提供二进制文件,而是让用户和发行版开发人员/打包人员处理问题。
只要确保您的应用易于编译,这意味着使用标准构建系统工具,例如 mesonbuild,并在 README.md 文件中添加一些构建指令。
【讨论】:
the binaries cannor be run。好吧,如果 ABI 没有改变,你至少有这个保证:它会运行。它可能会崩溃,因为这是一个未经测试的环境,具有不同的库版本组合,您可能会遇到特定的错误,但可以修复。但是,它仍然应该运行。甚至发行版在他们的周期中都有“大规模重建”,但即使没有这个东西也是可用的。
这取决于您对 GTK+ API 的真正依赖。
每个函数在其文档的末尾都有一个Since: 字段,用于说明它首次出现的 GTK+ 版本。您的两个目标版本都是 GTK+ 3,因此它们与 ABI 兼容。因此,您只需检查在 3.18 上运行为 3.22 编译的二进制文件时未找到哪些符号。在 3.18 之后添加了每个未找到的符号。 Since: > 3.18 的每个符号都不能使用,你需要使用最小的公分母。一旦识别出 > 3.18 的符号,您有 2 个选择:
.
#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
【讨论】: