Qt工程打包,针对Windows(X86)、Linux平台(X86和ARM架构)步骤全解
前言
因项目需求,利用Qt开发了跨平台应用,但是涉及部署,需要将程序部署至其他机房的服务集群中,因此阅读了大量参考文献,并经过大量测试,总结了如下Qt打包步骤,目前可适用于X86的Win系统及X86与ARM架构的Linux系统。由于手头设备有限,可以参考下表检查本文所述教程是否满足需求。
测试系统 | X86 | ARM |
---|---|---|
Windows+Qt 5.9.9 | 适用 | 未知 |
Linux +Qt 5.9.9 | 适用 | 适用 |
1.Windows系统下的Qt打包
安装完Qt 5.9.9版本后,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
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下的程序替换即可。
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目录直接手动拷贝到程序目录下:
2.2.4 ARM程序编译检查
X86的程序依赖做好之后,利用Qt针对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