仅通过debian/rules能否两次编译生成x86和ARM独立Debian包?
如何为Qt项目构建分架构的Debian二进制包
首先得理清你的需求:你想要针对x86(一般是amd64)和ARM(比如armhf/arm64)架构分别生成独立的Debian包,而不是同一个包包含多架构二进制(Debian不支持这种方式,架构相关包都是单架构的)。你之前尝试的PkgSplit其实是用来拆分同一个架构下的功能组件为多个包,不是用来处理跨架构构建的,这是你之前走偏的地方。
下面分两种场景给你具体解决方案:
场景1:生成同名但不同架构的标准Debian包(推荐)
这是Debian打包的常规做法:同一个源码包,针对不同架构生成对应架构的.deb包(比如myqtapp_1.0-1_amd64.deb和myqtapp_1.0-1_armhf.deb)。
步骤1:修正debian/control配置
只需要定义一个二进制包,Architecture设为any(表示这是架构相关包):
Source: myqtapp Section: utils Priority: optional Maintainer: Your Name <your-email@example.com> Build-Depends: debhelper-compat (= 13), qtbase5-dev, qt5-qmake, ${misc:Depends} Standards-Version: 4.6.0 Package: myqtapp Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Your Qt application Cross-platform Qt application compiled for the target architecture.
步骤2:配置debian/rules适配架构
Debhelper会自动传递目标架构变量DEB_HOST_ARCH,你可以用它来切换Qt的编译参数:
#!/usr/bin/make -f # 根据目标架构设置Qt编译spec ifeq ($(DEB_HOST_ARCH),amd64) QMAKE_SPEC = linux-g++-64 else ifeq ($(DEB_HOST_ARCH),armhf) QMAKE_SPEC = linux-arm-gnueabihf-g++ else ifeq ($(DEB_HOST_ARCH),arm64) QMAKE_SPEC = linux-aarch64-gnu-g++ endif # 通用debhelper规则 %: dh $@ --with qt5 # 覆盖configure步骤,传入架构对应的qmake参数 override_dh_auto_configure: dh_auto_configure -- \ QMAKE=qmake5 \ QMAKE_SPEC=$(QMAKE_SPEC)
步骤3:构建不同架构的包
- 原生架构构建:在x86机器上运行
dpkg-buildpackage -us -uc,直接生成amd64包;在ARM机器上运行同样命令,生成armhf/arm64包。 - 交叉编译构建(在x86机器上生成ARM包):
- 安装交叉编译工具链:
sudo apt install gcc-arm-linux-gnueabihf qtbase5-dev-armhf - 使用
dpkg-buildpackage的交叉编译参数:dpkg-buildpackage -us -uc -a armhf
- 安装交叉编译工具链:
场景2:生成不同包名的架构专属包(比如myqtapp-amd64和myqtapp-armhf)
如果你确实需要两个不同包名的架构专属包,可以按以下方式配置:
步骤1:修改debian/control
定义两个二进制包,分别指定对应架构:
Source: myqtapp Section: utils Priority: optional Maintainer: Your Name <your-email@example.com> Build-Depends: debhelper-compat (= 13), qtbase5-dev, qt5-qmake, ${misc:Depends} Standards-Version: 4.6.0 Package: myqtapp-amd64 Architecture: amd64 Depends: ${shlibs:Depends}, ${misc:Depends} Description: Your Qt application (x86/amd64) Qt application compiled specifically for amd64 systems. Package: myqtapp-armhf Architecture: armhf Depends: ${shlibs:Depends}, ${misc:Depends} Description: Your Qt application (ARM/armhf) Qt application compiled specifically for armhf systems.
步骤2:调整debian/rules实现架构区分安装
编译时根据目标架构把二进制文件安装到对应包的目录:
#!/usr/bin/make -f ifeq ($(DEB_HOST_ARCH),amd64) QMAKE_SPEC = linux-g++-64 PACKAGE_DIR = debian/myqtapp-amd64 else ifeq ($(DEB_HOST_ARCH),armhf) QMAKE_SPEC = linux-arm-gnueabihf-g++ PACKAGE_DIR = debian/myqtapp-armhf endif %: dh $@ --with qt5 override_dh_auto_configure: dh_auto_configure -- \ QMAKE=qmake5 \ QMAKE_SPEC=$(QMAKE_SPEC) override_dh_auto_install: # 将编译后的二进制安装到对应包的目录 install -Dm755 build/myqtapp $(PACKAGE_DIR)/usr/bin/myqtapp
这种方式下,在amd64机器上构建只会生成myqtapp-amd64.deb,在armhf机器上构建只会生成myqtapp-armhf.deb;如果要在x86机器上交叉编译ARM包,同样需要安装交叉工具链并使用-a armhf参数。
关键注意事项
- 不要混淆包拆分(PkgSplit)和跨架构构建:PkgSplit是把同一个架构的包拆成多个功能子包,和架构无关。
- 对于Qt项目,确保交叉编译时安装了对应架构的Qt开发库(比如
qtbase5-dev-armhf),否则qmake会找不到对应架构的头文件和库。 - 如果你经常需要跨架构构建,推荐使用
sbuild或pbuilder工具,它们可以创建干净的不同架构构建环境,避免本地环境干扰。
内容的提问来源于stack exchange,提问作者Jesper Melin
相关产品推荐
相关产品推荐

