Qt工程打包,针对Windows(X86)、Linux平台(X86和ARM架构)步骤全解

前言

因项目需求,利用Qt开发了跨平台应用,但是涉及部署,需要将程序部署至其他机房的服务集群中,因此阅读了大量参考文献,并经过大量测试,总结了如下Qt打包步骤,目前可适用于X86的Win系统及X86与ARM架构的Linux系统。由于手头设备有限,可以参考下表检查本文所述教程是否满足需求。

测试系统X86ARM
Windows+Qt 5.9.9适用未知
Linux +Qt 5.9.9适用适用

1.Windows系统下的Qt打包

安装完Qt 5.9.9版本后,Qt会自带一个命令工具:
Qt自带的命令运行工具
只需要将debug或release之后的程序test.exe放入到新建的11文件夹中,然后打开该命令工具,运行如下命令:

windeployqt D:\11\test.exe

Qt将自动拷贝运行所依赖的库。
打包过程
打包结果

2.Linux系统下的Qt打包

本章分为X86和ARM两种架构的打包

2.1 X86主机下的打包

X86架构的Linux主机较为常见,且用途广泛,因此拥有很全的工具,例如在Linux下,github上有专门的辅助工具linuxdeployqt来帮助我们打包。
下载链接:Github-linuxdeployqt

2.1.1 linuxdeployqt工具安装

为了我们后面使用时,改短一些名字:

mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt

然后修改为可执行权限

chmod 777 linuxdeployqt

再把这个可执行文件放进/usr/local/bin目录,这样,我们就可以在其他目录访问了

mv linuxdeployqt /usr/local/bin

测试是否安装成功

linuxdeployqt --version

输出版本信息,表示安装成功。
版本信息

2.1.2 Qt环境变量设置

工具会根据生成的可执行文件,自动搜索依赖,故我们需要确保Qt库的相关路径设置到环境变量中,这样工具在搜索时才能找到,并拷贝它们。
另外拷贝文件,对环境变量的使用,不想要重启系统那么麻烦,所以我们修改.bashrc文件,仅对当前用户永久有效。

vi ~/.bashrc

在.bashrc文件末尾,追加内容如下:

#add qt env
export PATH=/home/ubuntu/Qt5.9.9/5.9.9/gcc_64/bin:$PATH
export LIB_PATH=/home/ubuntu/Qt5.9.9/5.9.9/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/home/ubuntu/Qt5.9.9/5.9.9/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/home/ubuntu/Qt5.9.9/5.9.9/gcc_64/qml:$QML2_PATH

其中,/home/ubuntu/Qt5.9.9/5.9.9/gcc_64/是本次测试环境Qt安装目录,大家根据自己的情况替换。

然后,使用source命令让文件立即生效。

source ~/.bashrc

然后,对环境变量测试下,是否设置正确。如下:

qmake -v

qmake version

2.1.3 打包

拷贝前,确认生成的是Release版本的程序,这个是常识。在根目录下建立TestSetup目录,用于放置打包相关的文件;并在TestSetup下继续建个Test目录,用来装Test应用及拷贝文件,把我们的应用Test拷贝到Test目录下

mkdir TestSetup
cd TestSetup
mkdir Test

程序
【执行打包命令】

linuxdeployqt Test -appimage

终端报错,如下:
图标报错信息
不用管它,是关于桌面文件的,一会后,/TestSetup/Test目录下,已经把依赖全部拷贝好了。
打包结果
到此,直接将该文件夹拷贝到目标主机即可运行,后续的Deb包制作暂不讲述,感兴趣的朋友可参考相关资料。

2.2 ARM目标主机下的打包

若目标主机维ARM架构的Linux主机,则在开发机器上需要安装Qt的ARM交叉编译环境,ARM交叉编译环境的搭建见如下链接的文章,本文将直接从打包步骤开始讲述。
ARM-QT交叉编译环境搭建(参考前半段)
Linux+QT的ARM交叉编译配置(参考后半段)

2.2.1 Qt工程的修改

需要在Pro文件中,添加如下行

QMAKE_LFLAGS += -Wl,-rpath,\'\$$ORIGIN/lib\'

此行功能是让Qt程序运行时加载自己指定目录下的动态库,而不是系统默认的,避免和系统已有的Qt库发生冲突。
添加行

注意:需要首先针对X86生成可执行程序,才能进行后续依赖拷贝的步骤,依赖拷贝完成后,再利用交叉编译ARM下的程序替换即可。

首先选择X86进行编译

2.2.2 依赖拷贝脚本编写

需要使用ldd来查找依赖,并自动拷贝到我们app下的lib目录,在程序目录建了一个脚本 copylib.sh 内容如下:

#!/bin/bash
LibDir=$PWD"/lib"
Target=$1

lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)

for Variable in ${lib_array[@]}
do
  cp "$Variable" $LibDir
done

假设我们的Qt程序为 TestQt,这样我们使用 copylib.sh ./TestQt 就直接拷贝依赖到 lib目录下了。
需要注意的是,有些依赖库可能需要手动拷贝,若程序运行过程中提示缺少XXX.so,则在开发主机上搜索到此库,要带着符号链接一起拷贝到lib目录下

2.2.3 qt.conf编写

Qt程序指定 plugins 加载路径,这个需要用到 qt.conf 配置文件,在程序所在的目录下,新建qt.conf空白文件,并添加如下内容:

[Paths]
Prefix=./
Libraries=lib
Plugins=plugins

如果怕程序运行过程中缺少某些库,建议手动将/home/ubuntu/Qt5.9.9/5.9.9/gcc_64/下的plugins目录直接手动拷贝到程序目录下:
手动拷贝plugins目录

2.2.4 ARM程序编译检查

X86的程序依赖做好之后,利用Qt针对ARM架构进行交叉编译:
ARM编译
编译后的可执行文件,用file命令检查是否为ARM主机架构:
架构检查
然后将编译好的ARM程序对X86程序进行替换即可。

2.2.5 ARM程序执行过程中可能遇到的问题

由于依赖拷贝可能不全,因此可能导致在ARM主机上运行出现缺少依赖库等问题,可以根据程序运行提示将相关的依赖库手动再拷贝至lib目录中。本文提供了打包的相关库文件可自取ARM打包常缺少的库

结束语

Qt打包还需要细心多钻研呀。

3.参考文献

https://blog.csdn.net/zyhse/article/details/106381937
https://www.cnblogs.com/magicdmer/p/13457843.html
https://blog.csdn.net/qq_39302310/article/details/123997722
https://blog.csdn.net/u012902367/article/details/87876079

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驯龙高手_追风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值