使用linuxdeployqt在linux下进行Qt打包发布(超详细)

2023-11-14

首先,来说下,本教程实现的功能:

  • 在linux下对开发的Qt应用,进行拷贝依赖文件so等,并打成deb安装包;
  • 实现可安装、卸载,安装完毕自动在开始菜单下和桌面添加快捷方式;
  • 卸载后自动删除快捷方式,以及删除应用生成的log文件。

测试环境:ubuntu 16.04

一、使用linuxdeployqt拷贝依赖文件

win系统下有个自动拷贝依赖文件的工具windeployqt,而linux系统下也有个类似的工具,叫linuxdeployqt,原理一个意思。

该工具的帮助文档:https://github.com/probonopd/linuxdeployqt/blob/master/README.md

有兴趣,可以自己看看。

1. 下载linuxdeployqt

linuxdeployqt-x86_64.AppImage,下载地址:

https://github.com/probonopd/linuxdeployqt/releases

在这里插入图片描述

2. 安装linuxdeployqt

为了我们后面使用时,方便一点,我们把这长长的名字改短点吧:

mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt

然后修改为可执行权限

chmod 777 linuxdeployqt

再把这个可执行文件扔进/usr/local/bin目录,这样,我们就可以在其他目录访问了

mv linuxdeployqt /usr/local/bin

测试是否安装成功

linuxdeployqt --version

输出版本信息,表示安装成功。
在这里插入图片描述

3. Qt库路径设置到环境变量

工具会根据生成的可执行文件,自动搜索依赖,故我们需要确保Qt库的相关路径设置到环境变量中,这样工具在搜索时才能找到,并拷贝它们。

另外拷贝文件,对环境变量的使用,不想要重启系统那么麻烦,所以我们修改.bashrc文件,仅对当前用户永久有效。

vim ~/.bashrc

在.bashrc文件末尾,追加内容如下:

#add qt env
export PATH=/opt/Qt5.13.0/5.13.0/gcc_64/bin:$PATH
export LIB_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/qml:$QML2_PATH

其中,/opt/Qt5.13.0/5.13.0/gcc_64是本次测试环境Qt安装目录,大家根据自己的情况替换。

然后,使用source命令让文件立即生效。

source ~/.bashrc

然后,对环境变量测试下,是否设置正确。如下:

qmake -v

在这里插入图片描述

看到qmake的版本号,则表示设置成功。

提示:

根据linuxdeployqt在线帮助文档介绍,其实上述最重要的环境变量就是PATH这条,其他的并没有说,或许其他不要也没啥问题。

4. 拷贝依赖文件

拷贝前,确认生成的是Release版本的程序,这个是常识。

我们在根目录下建立TestSetup目录,用于放置打包相关的文件;

并在TestSetup下继续建个Test目录,用来装Test应用及拷贝文件。

mkdir TestSetup
cd TestSetup
mkdir Test

把我们的应用Test拷贝到Test目录下

在这里插入图片描述

使用命令执行依赖文件拷贝

linuxdeployqt Test -appimage

终端报错,如下:

在这里插入图片描述

不用管它,是关于桌面文件的,后面我们直接编辑它。

一会后,/TestSetup/Test目录下,已经把依赖全部拷贝好了。

在这里插入图片描述

我们可以看到创建了lib等目录。

需要说明的是,在执行“linuxdeployqt Test -appimage”命令时,其实除了拷贝依赖文件外,还对目标文件Test进行了修改,在Test中插入了一些库路径信息。

经过本人对前后2个文件内容的对比测试,至少是添加了lib目录的,其他没试过。

所以,你只需要把程序依赖的so文件放入lib目录下,无论是显式、隐式加载的so,都是可以搜索到的。

若你的应用中还有其他,如配置文件等资源,那么手动拷贝到你自己代码指定的目录下。

重要提示:

  • 因为linuxdeployqt将在内部使用ldd命令,来确定从何处将库复制到包中。ldd命令本身只能查找隐式加载的so,故若程序中代码使用显式加载的so,它是找不到的,这时需要开发者自己去保证显式加载so的路径可被搜索。
  • 举个例子:若存在程序A显式加载B.so,B.so隐式加载C.so,则对程序A使用linuxdeployqt拷贝依赖时,程序A的间接依赖文件C.so,将不会被拷贝。当程序跑起来加载B.so时,就会报找不到C.so的错误。这一点尤其需要注意。此时我们需要再对B.so使用一次linuxdeployqt拷贝依赖。这样程序A加载B.so,B.so加载C.so,就都可以找到了。

5. 配置共享库搜索路径(可选)

如果你的应用中,调用了其他的库,又想要放在某个指定目录下,那么可以在应用同目录下,添加qt.conf文件,指定库搜索路径。这块知识,就自行百度吧,反正最终目的,能正常启动应用就行。

6. 测试应用能否正常运行

此时,一个完整的运行环境已经具备了,我们测试一下。

重新开一个终端,在该终端的环境变量中去掉Qt库相关的路径,修改后的环境变量只对该终端生效,然后我们执行应用,看能否运行。

操作过程:先用export查看有哪些环境变量设置了Qt路径。

export

在这里插入图片描述

如果本教程之前没有配置过qt环境变量,那么结果应该和.bashrc文件我们追加的内容一致的。

然后把这些环境变量中Qt路径去掉:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export LIB_PATH=
export PLUGIN_PATH=
export QML2_PATH=

测试启动应用

./Test

此时如果不出意外,应该可以正常启动。

如果有意外,那就根据实际情况,先把问题解决,再继续。

二、打成deb包

1. deb包安装路径原理简述

下面举个例子进行说明,我们先来看打包目录与安装后目录结构对比。

打包目录,DEBIAN下面为deb包控制文件,应用与依赖文件位于source/opt/Test/,如下:

source
├── DEBIAN
│   └── control
│   └── postinst
│   └── postrm
├── opt
    └── Test
        ├── Test
        └── xxx

若按照此打包目录生成deb,安装后,其目录如下:

/
├── opt
    └── Test
        ├── Test
        └── xxx

小结:

DEBIAN目录下主要存放一些控制文件和脚本,具体后面使用到时,再细说。

DEBIAN目录固定放置于打包目录顶层。

deb包安装时,默认将内部文件,释放至根目录下(/),故我们需要在打包时,将安装目录层次创建好,以达到想要的安装路径效果。

2. 规划安装路径

我们希望将Test应用安装到/opt/Test/下,下面开始创建目录层次。

在/TestSetup/下创建output目录,用于存放生成的deb包;

创建source目录,用于存放打包文件,如下:

在这里插入图片描述

在source目录下,创建DEBIAN目录、创建安装路径层次opt目录以及opt/Test目录,如下:

在这里插入图片描述

然后将前面我们拷贝的依赖文件,全部移动到/TestSetup/source/opt/Test/目录下,如下:

在这里插入图片描述

3. 配置*.desktop桌面快捷方式文件

还记得前面,拷贝依赖文件时报错吗,就是这个桌面文件。

在这里插入图片描述

直接把它扔到桌面文件夹(~/Desktop/),它就可以变成一个带图标的快捷方式,类似win。

我们把位于/TestSetup/source/opt/Test/default.desktop改为Test.desktop;

它有如下内容,需要编辑:

[Desktop Entry]
Type=Application
Name=My Test                    #应用的名字(快捷方式显示的文字)
Exec=/opt/Test/Test             #应用的执行路径(绝对路径)
Icon=/opt/Test/Test.png         #应用的图标(绝对路径)
Comment=This is my test         #说明信息
Terminal=true                   #是否允许在终端启动

我们按照上述内容进行编辑,其中图标,自己随便去下载一个.png放到/TestSetup/source/opt/Test/Test.png即可。

注意:

Test.desktop文件需要有执行权限,该文件才能变成图标,否则只是显示一个普通文件。

Test.desktop中的路径需要填写deb包的安装路径,非打包路径。

Terminal=true时,启动程序时,会附带启动终端界面,即会出现2个界面。

Terminal=false时,启动程序时,没有终端界面,仅显示程序这一个界面。

4. 创建deb包之control文件

control文件主要描述软件包的名称(Package),版本(Version),Installed-Size(大小),Maintainer(打包人和联系方式)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。

我们在DEBIAN目录下创建名为control的文件,内容如下:

Package: mytest
Version: 0.1.0
Section: utils
Priority: optional
Architecture: amd64
Depends:
Installed-Size: 512
Maintainer: 123@163.com
Description: my test package

含义:

Package:包名。记住,后面卸载时候需要包名。

Version:应用版本。

Architecture:架构,我这里是amd64。

Maintainer:维护人员联系方式,看着办。

Description:软件包描述。

其他的,这里没用到,就不写了,自己百度吧。

5. 创建deb包之postinst文件

负责安装完成时的配置工作,软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行。

我们在DEBIAN目录下创建名为postinst的文件,内容如下:

#!/bin/sh
chmod 777 /opt/Test/Test.desktop
cp /opt/Test/Test.desktop /usr/share/applications/
cp /opt/Test/Test.desktop ~/Desktop/

主要将Test.desktop拷贝至2个目录,Desktop目录下,自动生成桌面快捷方式。

applications目录下,生成开始菜单中,other菜单下子项。

最终效果,查看文章末尾处效果图。

6. 创建deb包之postrm文件

软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行。

我们在DEBIAN目录下创建名为postrm的文件,内容如下:

#!/bin/sh
rm /usr/share/applications/Test.desktop
rm ~/Desktop/Test.desktop

主要工作就是删除postinst创建的2个文件。

7. 使用dpkg命令构建deb包

对source目录下所有文件打包,在output目录下生成deb包。

cd /TestSetup/source
dpkg -b . /TestSetup/output/test_amd64_0.1.0.deb

打包结果:

在这里插入图片描述

三、deb包的安装与卸载

1. 安装

安装deb包命令如下:

cd /TestSetup/output
sudo dpkg -i test_amd64_0.1.0.deb

安装完成,桌面效果:

在这里插入图片描述

开始菜单效果:

在这里插入图片描述

安装路径效果:

在这里插入图片描述

2. 卸载

卸载时,使用control文件中的包名。

sudo apt-get remove mytest

卸载之后,安装路径下文件全部删除,自动删除桌面快捷方式和菜单项。

若应用生成一些log文件,因不在打包文件中,故不会自动删除,

则需要在postrm文件中添加删除命令。

参考链接:

《Ubuntu下的deb打包、安装与卸载》

《Ubuntu中deb包详解及打包教程》

《Linux下通过.desktop文件创建桌面程序图标(快捷方式)及文件编写》



若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用linuxdeployqt在linux下进行Qt打包发布(超详细) 的相关文章

随机推荐

  • idea乱码解决方式大汇总

    目录 idea版本 解决方法 一 基本方法 1 File gt Settings gt Editor 2 二 Maven乱码解决方法 三 运行时乱码解决方法 四 因为以前乱设置导致的乱码 idea版本 解决方法 一 基本方法 1 File
  • 华为telnet学习笔记

    华为telnet用户密码aaa模式 配置完接口后 aaa local user admin password cipher cisco 创建用户设置账号密码 local user admin service type telnet 为这个用
  • QLUACM暑假训练5 C题题解

    C题题目大意 给一个n行m列的矩阵 矩阵的每个元素由 或者 填充 如果一行或者一列都由 构成 则删除这一行或者这一列 最后按照相对位置输出剩余的元素 题解 题目思路 1 我们需要找出一行或者一列都由 构成的行和列的位置 也就是我们需要找到没
  • 图像分割套件PaddleSeg全面解析(五)模型与Backbone代码解读

    本章节将介绍PaddleSeg的核心部分 分割模型和主干网络部分 在yaml配置文件中有以下定义 模型信息 model 模型的类型FCN type FCN 使用的主干网络为HRNet backbone type HRNet W18 主干网络
  • 宋浩高等数学笔记(六)定积分的应用

    本章继续更新高数笔记 6 5节的物理题暂不更新 有需求的同学自行看课
  • R语言:创建数据集

    文章目录 1 创建数据集 1 1 数据集的概念 1 2 数据结构 1 2 1 向量 1 2 2 矩阵 1 2 3 数组 1 2 4 数据框 data frame 的切片 attach detach 和with 实例标识符 1 2 5 因子
  • Flutter桌面小工具 -- 灵动岛【Windows+Android版本】

    通过此篇文章 你将了解到 Flutter动画实现灵动岛 Flutter如何开发一个置顶可自由拖拽的小工具 分享一些关于灵动岛的想法 本文为稀土掘金技术社区首发签约文章 14天内禁止转载 14天后未获授权禁止转载 侵权必究 前言 Flutte
  • FormData(file类型文件)

    有的时候我们上传图片时 后台要求是file类型 我们可以借助FormData 以这种方式上传的 后台接收到的 window files self files 0 if window files var form new FormData v
  • [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助
  • sql计算留存率

    SELECT first day sum case when by day 0 then 1 else 0 end day 0 sum case when by day 1 then 1 else 0 end day 1 sum case
  • 解决WebSocketClient.js?5586:16 WebSocket connection to ‘ws://192.168.1.102:8999/ws‘ failed:

    修改vue config js里的devServer配置 添加client 配置 client webSocketURL ws 0 0 0 0 8999 ws module exports 配置跨域请求 devServer 项目运行的端口号
  • frida辅助分析ollvm字符串加密

    frida辅助分析ollvm字符串加密 近期逆向任务繁重且艰巨 因此把工作期间得学习心得做下笔记还是十分得有必要得 防止后期遗忘 个人博客 http www zhuoyue360 com 文章目录 frida辅助分析ollvm字符串加密 一
  • JAVA解析纯真IP地址库

    前几天看了下Ruby的IPParse 觉得很过瘾 上网查了下貌似很多IP数据库都要收费的 就下了个纯真QQIP地址库 发现还可以在线升级的 很适合咱做点小玩意 具体解析的纯真版IP地址库请详见http lumaqq linuxsir org
  • Discuz!开发之主题高亮字段highlight解析

    Discuz 开发之主题高亮字段highlight解析 相关数据表pre forum thread 我们可以看到主题高亮信息存储于字段highlight 且为一个整型数据 那么discuz 如何将这个整型数解析为高亮 包括 字体颜色 背景颜
  • FPGA开发流程概述

    Lesson 3 FPGA开发流程概述 开始学习FPGA 想尽快上手FPGA开发 那么先来了解一下FPGA的开发流程 1 需求分析到模块划分 需求说明文档 器件选择 逻辑资源 功耗 IO数量 封装等等 配置电路考虑 开发工具选择 电路板的可
  • 数据结构与算法实验-实验一:线性表基本操作

    线性表基本操作 文章目录 线性表基本操作 题目1 题目2 题目3 题目1 线性表是最常见和常用的ADT 假设线性表的元素为整数 请基于顺序存储结构实现线性表ADT 基本功能包括 1 建立线性表 输入有两行 第一行是一个整数n 线性表的长度
  • SpringMVC自定义视图完成步骤 和 视图解析的源码剖析

    自定义视图完成步骤 7 2 1自定义视图完成步骤 1 自定义视图 创建一个 View 的 bean 该 bean 需要继承自 AbstractView 并实现 renderMergedOutputModel 方法 2 并把自定义 View
  • 【项目实战】在win10上安装配置Hadoop的环境变量

    一 说明 注意 该教程适用于 远程连接Linux上的Hadoop集群 因此本步骤是不需要在本地再下载hadoop的 在win10操作系统上 运行Hadoop以及其相关依赖包 比如Hbase依赖包 时 我遇到的情况是 我需要使用SpringB
  • 素数(埃式筛法、线性筛法)

    文章目录 素数判断方法 埃式筛法 线性筛法 区间筛法 质因数分解 例题 第一题 第二题 第三题 素数判断方法 最简单的就是从 2 n 1 都去与 n 取余 看是否能整除 bool prime int n for int i 2 i lt n
  • 使用linuxdeployqt在linux下进行Qt打包发布(超详细)

    首先 来说下 本教程实现的功能 在linux下对开发的Qt应用 进行拷贝依赖文件so等 并打成deb安装包 实现可安装 卸载 安装完毕自动在开始菜单下和桌面添加快捷方式 卸载后自动删除快捷方式 以及删除应用生成的log文件 测试环境 ubu