Qt·Linux下Qt、Qml程序的打包
背景:
最近开发一个传输应用,上位机是在Ubuntu上用 Qt开发的,但是实际运行是在麒麟系统上,所有需要对Ubuntu上的Qt程序进行打包
当前系统环境:
Ubuntu 20 + Qt 5.14 -------->>> 麒麟v10
尝试的方法:
一、linxudeployqt第三方工具
该方法网上有很多教程,感兴趣的可以尝试一下,例如:https://blog.csdn.net/zyhse/article/details/106381937
我一开始就是按照这个方法做的,不知道是因为我的机子环境配的不好还是什么问题,中途会遇到很多命令缺失的问题,一个个把命令安装好之后,最后一步打包时会报错Exec fomat什么的错误,网上也查不到,最终放弃,反正各种原因
二、利用脚本文件打包--个人推进
1.在桌面新建app文件夹
2.将QT项目以Release版本运行,会在项目同级目录下生成一个文件夹,例如
build-xxx-Desktop_Qt_5_14_2_GCC_64bit-Release
3.进入该文件夹,把其中的可执行文件复制到app文件夹内
4.在app文件夹内,新建copylib.sh文件,并且升级权限
sudo chmod 777 copylib.sh
5.在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
6.保存后执行./copylib.sh 1(可执行程序名),这一步之后文件夹内会生成lib文件
7.进入生成的lib文件夹,把其中所有文件都复制到app文件夹内并删除lib(这一步可以不删但是后续 .sh 中 LD_LIBRARY_PATH 需要加上 ./lib)
8.进入QT安装目录,找到platforms文件夹,将app文件夹内 ./copylib.sh 复制到 platforms文件夹,执行./copylib.sh libqxcb.so,得到一个新的lib库文件夹
寻找方法:
sudo find / -name platforms
9. 将 platforms文件夹 全部拷贝到 app 文件夹下, 并 删除 原来 platforms文件夹中的 lib文件夹和 copylib.sh(清楚垃圾)
10.将上一步新得到的文件夹内所有文件复制到app文件夹内(也可以复制到未删除的lib),然后删除上一步platforms下的lib文件夹
11.在app文件夹内新建xxxx.sh脚本文件,xxxx为自己的项目名(即可执行程序名这里必须相同),然后赋权限
sudo chmod 777 xxxx.sh
12.在xxxx.sh中加入代码
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=
export PATH=
export LD_LIBRARY_PATH
$dirname/$appname "$@"
注意:其中PATH和LD_LIBRARY_PATH的值自己填,一步PATH直接获取系统环境变量,LD_LIBRARY_PATH则设置当前文件(如果lib未删除则写lib文件路径),因为当前文件中已经包含了程序运行需要的库
13.在app文件夹下执行./xxxx.sh即可运行,打包app文件夹到其他主机也可以运行,但是最后一步的PATH和LD_LIBRARY_PATH要根据不同主机进行修改。
最后大功告成!!!!!
以上对于Qt程序是可以正常运行的,但是对于 QML程序还需要包含一些qml运行库
直接运行会报错:
qrc:/main.qml:2:1: module "QtQuick.Window" is not installed
qrc:/main.qml:1:1: module "QtQuick" is not installed
只加 qml 会报:
qrc:/main.qml:4:1: plugin cannot be loaded for module “QtQuick.Controls”: Cannot load library qml/QtQuick/Controls.2/libqtquickcontrols2plugin.so: (libQt5QuickControls2.so.5: cannot open shared object file: No such file or directory)
所以对于 qml 程序可以直接将 Qt5.14.2/5.14.2/gcc_64/qml Qt5.14.2/5.14.2/gcc_64/lib 加入到app中,并在LD_LIBRARY_PATH中加入./lib路径,即可!!!!但是包会有点大!!!