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

Qt·Linux下Qt、Qml程序的打包_第1张图片

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文件

Qt·Linux下Qt、Qml程序的打包_第2张图片

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

Qt·Linux下Qt、Qml程序的打包_第3张图片

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·Linux下Qt、Qml程序的打包_第4张图片

以上对于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路径,即可!!!!但是包会有点大!!!

Qt·Linux下Qt、Qml程序的打包_第5张图片

  • "xcb"错误:

在应用程序目录中,打开终端,

export QT_DEBUG_PLUGINS=1

运行应用程序的脚本./qmlvideo.sh ,可以查看依赖库加载过程,如下图:

Qt·Linux下Qt、Qml程序的打包_第6张图片

如有not found的依赖库,再去Qt安装路径下的platforms中找到复制过来。

  • Segmentation Fault

本人只是在移植到Ubuntu16时,出现段错误,请确保你的打包系统和移植系统一致。有库的版本问题,依赖问题,你可以选择连依赖基础库,如gcc都带进去.

  • 程序图片无法加载,图标无法显示

若程序有图片需要加载,涉及到图形依赖库,在Qt安装目录中和platforms同目录下有个imageformats目录:

Qt·Linux下Qt、Qml程序的打包_第7张图片

将整个imageformats目录复制到NewPro目录中即可,同时,如果有预加载图片,也要一并放入NewPro中,若以qrc的形式加载,也要将qrc文件目录放到NewPro中。

你可能感兴趣的:(QT学习,linux)