Vala编译适配低版本GTK+:Ubuntu跨版本兼容编译方法问询
如何编译适配更低版本GTK+运行时的程序?
遇到这种高版本系统编译的程序无法在低版本系统运行的问题很常见,核心原因是程序链接了高版本GTK+的动态库符号,而低版本系统没有这些符号。下面是几个可行的解决方案,按推荐程度排序:
1. 在目标系统(Ubuntu 16.04)的环境中编译
这是最稳妥的方法,直接在Ubuntu 16.04环境下编译程序,自然会链接到系统自带的GTK+ 3.18库,生成的二进制文件完全兼容目标系统。你可以通过以下方式搭建环境:
- 使用虚拟机:安装Ubuntu 16.04虚拟机,配置开发环境后编译代码。
- 使用Docker容器:拉取Ubuntu 16.04官方镜像,挂载你的代码目录,安装依赖后编译。示例命令:
docker run -v /path/to/your/code:/code -it ubuntu:16.04 # 在容器内执行 apt update && apt install libgtk-3-dev build-essential cd /code make # 或者你的编译命令 - 使用chroot环境:在Ubuntu 17.10中创建一个Ubuntu 16.04的chroot环境,在里面编译。
2. 强制编译时使用低版本GTK+ API
GTK+提供了编译宏来限制程序使用的API版本,确保你不会调用目标版本之后新增的函数。具体操作如下:
- 在源代码中定义宏:在所有包含GTK头文件的代码开头添加:
这样编译器会检查你是否使用了GTK+ 3.18之后才引入的API,如果用了会报错。#define GTK_VERSION_MIN_REQUIRED GTK_VERSION_3_18 #define GTK_VERSION_MAX_ALLOWED GTK_VERSION_3_18 - 在编译命令中添加宏参数:如果不想修改代码,可以在编译时通过
gcc或make传递参数:
注意:这个方法只能保证你不调用高版本API,但如果你的系统安装的GTK+库是3.22,编译出来的程序仍然会链接3.22的符号,所以最好配合在目标系统测试。gcc your_code.c -o your_program `pkg-config --cflags --libs gtk+-3.0` -DGTK_VERSION_MIN_REQUIRED=GTK_VERSION_3_18 -DGTK_VERSION_MAX_ALLOWED=GTK_VERSION_3_18
3. 静态编译GTK+库
把GTK+ 3.18及其所有依赖库(如glib、cairo、pango等)静态链接到你的程序中,这样程序不依赖系统的动态库。但这个方法比较复杂:
- 下载GTK+ 3.18的源码包及其所有依赖的源码。
- 编译这些库时启用静态编译选项(
./configure --enable-static)。 - 编译你的程序时链接这些静态库。
不过静态编译的缺点很明显:程序体积会变得很大,而且后续系统的安全更新无法自动应用到你的程序中,所以除非必要,不推荐这个方法。
4. 交叉编译
如果必须在Ubuntu 17.10上编译,你可以设置交叉编译环境,针对Ubuntu 16.04的系统架构和库版本编译。步骤大致如下:
- 添加Ubuntu 16.04的软件源到你的系统。
- 安装针对16.04的交叉编译工具链和GTK+开发库。
- 配置编译脚本使用交叉编译工具链,链接16.04的库文件。
这个方法配置起来比较繁琐,适合有一定编译经验的用户。
额外注意事项
除了GTK+,还要注意其他依赖库的版本兼容性,比如Ubuntu 16.04的glib版本是2.48,而17.10是2.54,你可以用类似的宏限制glib的API版本:
#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_48 #define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_2_48
内容的提问来源于stack exchange,提问作者Sadeep Weerasinghe
相关产品推荐
相关产品推荐

