当前位置: 首页 > article >正文

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


http://www.kler.cn/a/1000.html

相关文章:

  • Android SystemUI——服务启动流程(二)
  • 泛目录和泛站有什么差别
  • Kotlin构造函数
  • 机器学习基础-机器学习的常用学习方法
  • LeetCode 3270.求出数字答案:每位分别计算 或 for循环
  • 学习模板之一
  • Linux(传输层二继续讲TCP)
  • 关于进制转换
  • 【C++】Google编码风格学习
  • 11广义表的基本概念和性质
  • mysql创建索引导致死锁,数据库崩溃,完美解决方案
  • 自训练和协同训练简述
  • C/C++考试必考题目(含答案*仅供参考)
  • 0108 JQuery
  • C # FileStream文件流
  • Vue初入,了解Vue的发展与优缺点
  • 第二章 测验【嵌入式系统】
  • stack_queue | priority_queue | 仿函数
  • 《伤寒论》398条文——张仲景
  • 重构对象-Introduce Local Extension引入本地扩展八
  • 手把手教你 在linux上安装kafka
  • SpringBoot自定义Mybatis拦截器实现扩展功能(比如数据权限控制)
  • 关于利用FFT分析时域信号幅相的思考与验证
  • python 正则使用详解
  • vFlash软件简介
  • 重构对象-Remove Middle Man移除中间人六