Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vala:为较低的GTK版本编译_Gtk_Gtk3_Vala - Fatal编程技术网

Vala:为较低的GTK版本编译

Vala:为较低的GTK版本编译,gtk,gtk3,vala,Gtk,Gtk3,Vala,我的电脑运行的是Ubuntu 17.10和GTK+3.22 在这个环境下编译时,二进制文件不能在Ubuntu 16.04下运行,因为只有GTK+3.18与Ubuntu 16.04兼容。如何为较低的GTK运行时级别进行编译?不过,另一种方法也可以 在较旧的OS版本上编译二进制文件,在较新的OS版本上应该可以正常工作 通常的解决方案是根本不提供二进制文件,而是让用户和发行版开发人员/打包人员处理这个问题 只需确保你的应用程序易于编译,这意味着使用标准的构建系统工具,如mesonbuild,并在REA

我的电脑运行的是Ubuntu 17.10和GTK+3.22


在这个环境下编译时,二进制文件不能在Ubuntu 16.04下运行,因为只有GTK+3.18与Ubuntu 16.04兼容。如何为较低的GTK运行时级别进行编译?

不过,另一种方法也可以

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

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


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

但另一种方法也可以

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

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


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

这取决于你对GTK+API的真正依赖性

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

您可以使用3.18的方式,并将代码更改为不使用3.18之后引入的符号。这意味着您可能必须使用不推荐使用的符号,但它们将一直存在,直到下一个API中断,即GTK+4。 或者尝试从两个版本中获取最新功能,方法如下:


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

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

您可以使用3.18的方式,并将代码更改为不使用3.18之后引入的符号。这意味着您可能必须使用不推荐使用的符号,但它们将一直存在,直到下一个API中断,即GTK+4。 或者尝试从两个版本中获取最新功能,方法如下:


我不同意。ABI在GTK+的次要版本之间没有更改,因此您可以构建并链接到3.22,并在3.18上使用,前提是您在代码中使用3.18之后引入的no符号。是的,GTK+ABI在次要版本中不应更改,但在技术上无法保证它能正常工作。其他图书馆呢?使用发行版Y创建一个应该在发行版X或发行版版本X上工作的二进制文件不是正确的方法。这在Android或Windows上是完全不同的,在Android或Windows上,有一组精心策划的库,保证永远不会改变。警告:您必须始终确保不会意外地使用较新的API函数。没有技术上强有力的保证它会工作吗?OP抱怨无法运行二进制文件。如果ABI没有改变,至少你有这个保证:它会运行。它可能会崩溃,因为这是一个未经测试的环境,具有不同的库版本组合,您可能会遇到特定的bug,但这是可以修复的。但是,它仍然应该运行。即使发行版也有大规模的重建,但即使没有,也可以使用。有几种方法可以实现这一点:使用16.04在VM中编译,在Launchpad上设置PPA,让它为16.04构建debs,或者在您的计算机上运行16.04。我不同意。ABI在GTK+的次要版本之间没有更改,因此您可以构建并链接到3.22,并在3.18上使用,前提是您在代码中使用3.18之后引入的no符号。是的,GTK+ABI在次要版本中不应更改,但在技术上无法保证它能正常工作。其他图书馆呢?使用发行版Y创建一个应该在发行版X或发行版版本X上工作的二进制文件不是正确的方法。这在Android或Windows上是完全不同的,在Android或Windows上,有一组精心策划的库,保证永远不会改变。警告:您必须始终确保不会意外地使用较新的API函数。没有技术上强有力的保证它会工作吗?OP抱怨无法运行二进制文件。那么如果
ABI不会改变,至少你有这个保证:它会运行。它可能会崩溃,因为这是一个未经测试的环境,具有不同的库版本组合,您可能会遇到特定的bug,但这是可以修复的。但是,它仍然应该运行。即使发行版也有大规模的重建,但即使没有,也可以使用。有几种方法可以实现这一点:使用16.04在VM中编译,在Launchpad上设置PPA,让它为16.04构建debs,或者在您的计算机上运行16.04。
#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