【QT 5 +Linux下软件qt软件打包+qt生成软件创建可以安装压缩包+学习他人文章+第三篇:学习打包】

【QT 5 +Linux下软件qt软件打包+qt生成软件创建可以安装压缩包+学习他人文章+第三篇:学习打包】

1、前言

qt软件生成后,需要使用linuxdeployqt工具生产,才能放到其他电脑上运行,但是我们发现其实无法想win那样,直接点击exe一样,直接运行,本篇为第三章,通过前两篇,我们已经基本知道,如何生成软件,如何做桌面快捷图标。感兴趣想要了解全程细节,可以从第一章开始看。

【QT 5 +Linux下软件生成+qt软件生成使用工具+学习他人文章+第一篇:使用linuxdeployqt软件生成】

【QT 5 +Linux下软件桌面快捷方式+qt生成软件创建桌面图标+学习他人文章+第二篇:编写桌面文件.desktop】

  • 第一篇:使用linuxdeployqt软件生成
  • 第二篇:桌面文件.desktop,文件编写与软件图标
  • 第三篇:打包生成安装的包(.deb)

2、实验环境

实验环境还是挺重要的,因为有时候,在你电脑上能运行的东西,在别人的电脑就不一定能运行,这一部分的原因就可能是实验版本不一样,另外也发现其他小伙伴,也会问些问题,之前有人大致环境装的和我差不多,当时是win的环境,结果编译遇到问题,就跑过来问是不是环境不对,这还是要具体问题具体分析的,当时看了看,发现是其他问题,总的来说,环境还是挺重要的。

系统环境:

环境问题还是要注意下的,不同环境下可能还真的可能不一样。

QT软件版本环境: Linux qt环境

3、自我学习总结-本篇总结

(1)了解安装包的目录结构

如果没有做过相关linux打包,作为一个新手,看到目录结构,都少还是有些懵逼的,因为有使用win的习惯,就用win来打比方,我们安装一个软件的时候,是可以选择软件安装目录的。

对照linux,linux默认有安装目录,我们写好的软件一般都安装在/opt/下。

而这是怎么做到的呢,就是靠事先规划目录做到的,如下为参考文章的截图。

如下,其中这个目录做的非常好。

c 复制代码
source
├── DEBIAN
│   └── control
│   └── postinst
│   └── postrm
├── opt
    └── Test
        ├── Test
        └── xxx

如下用我本工程的目录进行说明。

总结来说:

(1)DEBIAN这里的脚本帮助我们软件安装时执行一些命令

(2)opt就是我们要装在其他机子上,在那个机子上opt的根目录下,具体/opt/目录下的目录结构。

(2)了解要编写文件与编写脚本

然后我们来了解下编写的文件,也就是DEBIAN下的是三个文件。

如下为解释说明三个文件:control,postinst 和 postrm

如下为在网上找相关解释,和自己理解做的以下总结。

1. control文件

control文件是位于软件包DEBIAN目录中的一个文本文件,包含了软件包的元数据和管理信息。这些信息帮助dpkg和高级包管理工具(如apt)理解软件包的属性,包括但不限于:

  • Package: 软件包的名称。
  • Version: 软件包的版本。
  • Architecture: 软件包支持的架构(如amd64、i386、all等)。
  • Depends: 软件包的依赖项,列出了运行该软件包所必需的其他软件包。
  • Description: 软件包的简短描述以及更详细的描述。

简单说:就是control文件要写一些配置信息,让打包工具识别,control文件是创建.deb包时是的必需的,没有它,软件包将无法正确安装。。

2. postinst文件

postinst是一个可执行脚本,它在软件包安装之后执行。这个脚本通常用于执行软件包安装后需要完成的配置任务,比如:

  • 更新系统配置文件。
  • 启用或重启服务。
  • 更新应用程序数据库或系统缓存。

简单说:辅助做些自动化安装过程

postinst脚本为软件包提供了在标准安装过程之外,执行额外任务的能力。这块其实多少有些脱离qt了,有点看重使用shell能力,上述罗列项目是包括但不限于,还可以做很多其他事情。如果postinst脚本执行失败,软件包可能会被dpkg标记为一个错误状态。

3. postrm文件

postrm是在软件包被移除或卸载之后执行的脚本。这个脚本用于清理软件包安装过程中可能产生的残留文件和配置。常见的postrm脚本任务包括:

  • 删除由软件包创建的配置文件。
  • 清理缓存文件。
  • 更新或重建系统数据库,例如在软件包卸载后从菜单中删除条目。

简单说:就是用于卸载。postrm脚本确保软件包可以干净地被移除,避免留下无用的文件或配置。

4.总结

在Debian系统和基于Debian的Linux发行版中,创建.deb软件包涉及几个关键的控制文件,这些文件指导了软件包的安装、配置和卸载过程。其中,control、postinst和postrm是三个非常重要的文件。

control、postinst和postrm文件共同工作,确保软件包能够被正确地安装、配置和卸载。它们是创建.deb软件包时必须小心处理的关键组件,对于软件包的生命周期管理至关重要。正确编写和使用这些文件可以大大提高软件包的质量和用户体验。

自己在实际测试的过程中,多次遇到问题,就是某些文件内容写错了,或者不匹配,反复磨合,这块没有好的办法,多加练习。

(3)了解打包命令和安装命令:工具dpkg

解释工具dpkg,也特意上网查了这个工具。

dpkg是Debian及基于Debian的Linux发行版(如Ubuntu)中的底层包管理系统工具。它用于安装、构建、删除和管理Debian软件包,但不解决包之间的依赖关系。这个工具是Debian包管理的核心,提供了直接操纵软件包的基本功能。对于解决依赖问题,通常会使用更高级的工具,如apt(Advanced Package Tool),它在dpkg之上提供了更友好的用户界面和自动依赖管理。

1. 主要功能
  • 安装、卸载和重新配置软件包:dpkg可以用来安装(.deb文件)、卸载已安装的软件包,或者重新配置那些已经安装但可能因配置问题需要重新设置的软件包。
  • 查询软件包信息:可以查询已安装软件包的信息,包括软件包的版本、描述、依赖关系等。
  • 列出已安装的软件包:dpkg提供了列出系统上已安装软件包的功能。
  • 检查软件包文件:可以检查.deb文件的内容,包括它将会安装哪些文件到系统上。
2. 常用命令
  1. 安装一个软件包: sudo dpkg -i package_file.deb
  2. 卸载一个软件包(保留配置文件): sudo dpkg -r package_name
  3. 完全删除一个软件包(包括配置文件): sudo dpkg -P package_name
  4. 列出所有已安装的软件包: dpkg -l
  5. 查询一个已安装软件包的信息: dpkg -s package_name
  6. 检查.deb文件的内容: dpkg -c package_file.deb
  7. 重新配置一个已安装的软件包: sudo dpkg-reconfigure package_name
3. 注意事项

虽然dpkg非常强大,但在处理依赖关系时可能不如apt等高级工具方便。例如,如果你尝试使用dpkg安装一个软件包,而这个包依赖于系统中未安装的其他包,dpkg将会报错并停止安装过程。在这种情况下,你需要手动安装所有缺失的依赖,或者使用apt-get install ./package_file.deb命令来自动处理依赖关系并完成安装。

4. 其它

dpkg是Debian系统包管理的基石,了解其基本用法对于管理Debian或基于Debian的系统是非常有用的。

4、参考链接-感谢

学习他人文章,至少有个大致规划,知道哪步骤该什么,如下,为自己参照的文章。
https://blog.csdn.net/zyhse/article/details/106381937

5、实验过程

整个实验还是细节比较多的,于是很多步骤简单重新说明下。

1、进入相关目录

如下,是qt自动生产的release版本(默认给人的软件,或者发布就是release的,一般不用debug的)的目录。我们将其中文件test1_hello文件直接放在之前准备好的 testSetup/source/opt/test下。文件下

如下图,为我自己整个目录结构,使用tree工具后,观看就非常方便了。

如下,将其中重要部分放在下面了。

shell 复制代码
└── testSetup
    ├── output
    ├── source
    │   ├── DEBIAN
    │   └── opt
    │       └── test

2、创建目录

那我们分别在testSetup,创建两个文件夹分别是 output 和 source的

shell 复制代码
mkdir output source

如上我这里已经有了,所以为了给大家示范,创建了其他文件夹。

然后进入source目录,创建另外两个目录

shell 复制代码
mkdir DEBIAN opt

解释:

(1)DEBIAN 文件夹就是用来装三个文件:control postinst postrm

(2)opt 前面也解释了,用来放软件本体,也就是安装在他人电脑下,会默认安装在 根目录/opt/xxx(xxx代表软件名字)的目录下。

3、导入工程

我们进入 opt 目录下,再建立一个目录,就是软件文件夹名字。

进入文件夹后,将之前qt生成的软件复制过来我们,要生成软件,并且改下名字。

4、生成软件

再次目录我们使用命令,生产相关库。

shell 复制代码
linuxdeployqt test-my-demo -appimage

我这里已经生成,工程内容如下,猜测不同版本,可能文件会有差异

5、编写桌面文件

其中我们需要替换掉桌面文件和图标文件。

经过上述步骤 工程文件就准备好了,我们推到上层目录去编写三个文件。

6、编写三个文件

(1)进入目录
(2)生成文件

使用工具 vim 创建三个文件

shell 复制代码
vim control
vim postinst
vim postrm
(3)编写内容

1、文件control

shell 复制代码
Package: test-my-demo
Version: 0.1.0
Section: utils
Priority: optional
Architecture: all
Depends:
Installed-Size: 512
Maintainer: 123@163.com
Description: my test package

注意:自己通过测试,发现Package 这一栏中内容,不能有大小写,和下划线。
test-my-demo

2、文件postinst

这块在网上找到相关写法,可以识别有没有目录。

shell 复制代码
#!/bin/sh

# 设置.desktop文件的权限
chmod 777 /opt/test/test-my-demo.desktop

# 复制到应用程序启动器目录
cp /opt/test/test-my-demo.desktop /usr/share/applications/

# 尝试复制到当前用户的桌面目录
# 注意:在安装包时,使用~可能不会指向预期的家目录,因此需要确定正确的家目录路径
DESKTOP_DIR="$HOME/Desktop"
if [ -d "$DESKTOP_DIR" ]; then
    cp /opt/test/test-my-demo.desktop "$DESKTOP_DIR"
else
    # 如果桌面目录不存在,尝试使用图形环境下的默认路径
    if [ -d "/home/$SUDO_USER/Desktop" ]; then
        cp /opt/test/test-my-demo.desktop "/home/$SUDO_USER/Desktop"
    elif [ -d "/root/Desktop" ]; then
        # 如果是以root用户运行,尝试复制到root的桌面目录
        cp /opt/test/test-my-demo.desktop "/root/Desktop"
    else
        echo "Desktop directory not found."
    fi
fi

exit 0

从自己实际情况来看,各种情况都有可能,有人可能连桌面都没有,喜欢用命令行的方式。

3、文件postrm

shell 复制代码
#!/bin/sh
rm -f "/usr/share/applications/test-my-demo.desktop"
rm -f "/root/Desktop/test-my-demo.desktop"

为了更好的让软件卸载,可以多加些内容,保证安装后卸载。这里只是按照参考文章示例。

(4)给文件权限

给文件权限,虽然提示是一个范围,但是需要给到范围最大:

如果特殊的情况,还可能需要加上sudo

shell 复制代码
chmod 0775 postinst postrm

7、打包命令

然后进入source目录下,再次目录下,使用命令。

shell 复制代码
sudo dpkg -b . ../output/test-my-demo_deb_v1.0.deb

这里最后包的名字可以随意起名字。

需要注意的是,命令里三个".",初次使用,建议复制,否则很容易看错,这里三个点,第一个"."和第二个"."是有间隔的,很容易看错。

8、安装命令

然后我们放到另一个电脑,或者安装在自己电脑上也行。

shell 复制代码
sudo dpkg -i test-my-demo_deb_v1.0.deb

注意:我这里,其实安装过了,所以先要卸载下,使用如下命令

shell 复制代码
sudo dpkg -r test-my-demo 

9、允许启动

如下图,桌面上会有这样的一个文件,右键>>>"允许启动"

就变成了了图标

10、运行&验证

在本机上,验证就完成了。

在另一台电脑上验证:

6、工程文件与压缩包

如下为工程压缩包,觉得有价值可以拿走。
https://download.csdn.net/download/qq_22146161/88890139

7、细节部分

(1)control的Package命名问题

如下,自己看是在这个文件里,命名App名字的时候,会提示,不能压缩包。

开始以为是命名deb包不对,后来才知道是control文件里命名,不能有大写字母和"_"(下划线) 。

(2)所遇到问题-权限问题

开始按照提示,并给两个文件postints 和 postrm,特定权限,可是就是提示权限不够,如下图,后来只能给 0755的权限

(3)"允许启动"

这个说过,电脑系统桌面,配置有关系,自己测试,好像不是都需要允许启动,有需要的,有不需要,至少我这个电脑需要。另外好像,有些电脑,就没有这个"允许启动(不一定是中文)"选项。

注意这里不确定是解决方案:之后会写写一篇关于直接点击脚本文件就能运行的方式,好像安装那个也能解决部分问题。

(4)三个文件是否有尾椎扩展名:无

开始自己有些疑问,其中一个疑问就是既然"control","postinst"和"postrm"是装载脚本命令,就是有些命令比如"cp"什么的,那么大家说到脚本的时候,是文件本身就叫"postinst",还是说省略了后缀,文件全名叫"postinst.sh".

后来上网查了下,这三个文件没有任何拓展名,就叫做"control","postinst"和"postrm"。

如下图

(5)目录显示工具:tree

开始觉得参考文章里目录结构做的太好了,后来想到:是否有某种工具可以显示呢,一查还真有,就是tree

在Linux中,要显示一个文件夹下的目录结构,可以使用tree命令。tree命令以树状图的方式展示目录的结构,包括目录中的所有文件和子目录。如果系统中未安装tree命令,可以通过包管理器安装。

1.例如,在基于Debian的系统中,可以使用以下命令安装:

shell 复制代码
sudo apt-get install tree

2.安装完成后,你可以简单地运行以下命令来显示当前目录下的结构:

shell 复制代码
tree

3.如果想显示某个特定目录下的结构,可以将该目录作为tree命令的参数,如下所示:

shell 复制代码
tree /path/to/directory

4.此外,tree命令还有一些有用的选项,例如:

  • -L level:限制目录树显示到特定的层数。
  • -a:显示所有文件和目录,包括以.开始的隐藏文件。
  • -d:仅显示目录。
  • -f:显示每个文件的完整路径。

8、总结

终于完成 qt 工具 linuxdeployqt 工具学习,整个linux打包就可以使用了。

相关推荐
slomay44 分钟前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
hengzhepa1 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
威桑3 小时前
记一次控件提升后,运行却不显示的Bug
qt
小小洋洋3 小时前
BLE MESH学习1-基于沁恒CH582学习
学习
韩楚风3 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学3 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO3 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu73 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我3 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、3 小时前
【Linux】进程地址空间(初步了解)
linux