整理这篇文档的意义在于:自己走了很多弯路,淋过雨所以想为别人撑伞,也方便回顾,仅供参考
ps:
- 第一次做Windows下打包,用了2小时,第二次20秒
- 第一次做Linux(ubuntu)下打包,用了8小时,第二次1分半
一、Windows
有许多比较坑的帖子,会带新人走不少弯路,大家注意鉴别(没方法,随缘)
1、首先,找到自己编译的对应版本:
2、找到构建后的文件夹,复制当前生成的exe文件到一个新的文件夹(打包的目的文件,如:fileName)
3、找到对应版本的Qt文件,右键管理员运行
4、通过命令走到指定的地址
5、输入打包命令
windeployqt autoFileSet.exe --qmldir F:\Git-program\qt_practice\autoFileSet
autoFileSet.exe是我的程序名
F:\Git-program\qt_practice\autoFileSet 是我QML源文件地址
到这里就拷贝成功了
二、Linux
Linux下有两种方法,一种是通过自动化打包工具,一种是通过脚本,各有利弊
程序名以autoFileSet为例
1、自动工具打包
1、工具下载:下载地址
我使用的虚拟机。
2、修改名称:mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt
3、修改权限:chmod 777 linuxdeployqt
4、放入/usr/local/bin目录,方便调用:sudo mv linuxdeployqt /usr/local/bin
5、测试,打印版本:linuxdeployqt --version
结果:
linuxdeployqt (commit 2b38449), build 62 built on 2023-12-27 21:00:01 UTC
6、根据环境变量找寻qt库文件:vim ~/.bashrc
7、在Vim里添加对应路径:
8、添加后让其生效:source ~/.bashrc
9、测试,打印版本:qmake --version
QMake version 3.1
Using Qt version 5.12.12 in /home/***/Qt5.12.12/5.12.12/gcc_64/lib
10、创建对应的文件夹,把可执行文件拷过来。
11、执行自动拷贝:linuxdeployqt fileName -appimage,检查是否拷贝成功
12、运行测试:./ autoFileSet
13、压缩文件到当前目录:sudo tar cvf autoFileSet.tar ./*
如有库的缺失看第三节
2、脚本打包
1、新建文件夹:mkdir File
2、进入文件夹:cd File
3、新建脚本文件:touch copylib.sh
4、通过vim修改脚本内容:
#!/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
5、新建脚本文件:touch autoFileSet,修改内容
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
VLC_PLUGIN=$PWD/plugins
echo $VLC_PLUGIN
LD_LIBRARY_PATH=$dirname
export VLC_PLUGIN_PATH=$VLC_PLUGIN
echo $LD_LIBRARY_PATH
export LD_LIBRARY_PATH
$dirname/$appname "$@"
6、修改权限
sudo chmod 777 copylib.sh
sudo chmod 777 autoFileSet.sh
7、获取release生成的文件,拷贝至目标文件File
8、执行./copylib.sh autoFileSet
命令,生成lib文件夹
9、将lib文件夹下面的库拷贝到File文件夹下面,此时完成了添加程序依赖库
10、在Qt的安装目录下,将copylib.sh复制到platforms文件夹当中,执行./copylib.sh libqxcb.so
命令,此时也会生成lib文件夹,同样复制lib内的库到File下,重复的选替换即可
11、将platforms整个文件夹拷贝到File文件夹下
12、执行./autoFileSet.sh即可运行软件
如有库的缺失看第三节
3、库的缺失
两种打包方法都有问题,但是报错会提醒到我们,无非是某些库没有复制到,这里需要我们进行手动复制、拷贝。
常见错误如:
QQmlApplicationEngine failed to load component
qrc:/main.qml:3 无法为模块“QtQuick.Controls”:
无法加载库 /home/mbox/autoFileSet/QtQuick/Controls.2/libqtquickcontrols2plugin.so:
(libQt5QuickTemplates2.so.5: cannot open shared object file: No such file or directory) 加载插件
这代表缺少libQt5QuickTemplates2.so.5
QQmlApplicationEngine failed to load component
qrc:/main.qml:3 模块“QtQuick.Controls”没有安装
qrc:/main.qml:1 模块“QtQuick”没有安装
qrc:/main.qml:6 模块“QtQuick.Controls.Material”没有安装
qrc:/main.qml:4 模块“QtQuick.Layouts”没有安装
qrc:/main.qml:2 模块“QtQuick.Window”没有安装
这代表识别QtQuick失败,这个坑
我走的比较久,原因是太信任报错了。
因为当前主流已经使用到QtQuick2
版本以后了,这里的报错意思是识别不到QtQuick2
,一定注意一下。
确认方法:修改本地QT的名称,比如:Qt5.12.12,修改为666,如果程序正常运行、功能无缺陷就代表打包成功了。
压缩
验证无误之后,就可以压缩文件了:sudo tar cvf autoFileSet.tar ./*
,到此全部流程结束。