将 QT 应用程序打包成如意玲珑软件包

在上一篇文章《国产系统之如意玲珑》中,我为大家介绍了一款创新的国产软件包管理工具——如意玲珑(Linyaps)。该工具集致力于解决 Linux 系统下传统软件包格式带来的复杂性和依赖问题,提供了一种更独立、更简洁的打包和管理方式。

本文将通过一个简单的 QT 应用示例,带大家走一遍如何将其打包成玲珑包的过程。虽然如意玲珑项目的官网提供了一些文档和示例,但在实际项目中仍会遇到不少问题,我也在这次探索中踩了些坑,希望这篇文章能为大家提供一些帮助。

本文使用的开发环境为 Deepin V23 系统,Qt Creator 13.0.2,Qt 库使用的版本为 5.15.2。源码托管在

https://e.coding.net/mogoweb/qt-in-action/qt-in-action.git

文中用到的源码位于 LingLongDemo 目录下,供大家参考。

1. 创建一个简单的 QT 工程

6048c491b6398d74d0c5f5ab6f76ed91.png

678903c4fd9c06028aa8585d50532b90.png

5a69f623562ee9be23377ed7e83b7288.png

简单修改一下窗体里的显示,最后运行显示如下:

4b4e5fd71803940c9e218584715b0664.png

2. 添加一个 .desktop 文件

在 Linux 系统中,.desktop 文件用来描述应用程序的名称、图标、可执行程序等等,应用程序只有建立了 .desktop 文件,并放在系统的正确位置,才会在起始菜单项中出现。

在Qt Creator 中新建一个空文件:

9319446baf15b44f3e96138983f50b45.png

文件命名为 hello-linglong.desktop:

71a2dacde814f42f634763e53aa9098c.png

文件的内容如下:

[Desktop Entry]
Exec=LingLongDemo
GenericName=LingLong Demo
Hidden=false
Name=LingLong Demo
StartupNotify=false
Type=Application

其中,Exec 指定可执行程序名,Name 则为应用程序的名称。

修改 qmake 文件

LingLongDemo.pro 文件中添加以下内容:

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.
#qnx: target.path = /tmp/$${TARGET}/bin
#else: unix:!android: target.path = /opt/$${TARGET}/bin
target.path = $$PREFIX/bin
!isEmpty(target.path): INSTALLS += targetCONFIG(release) {message("Release build")desktop.files += hello-linglong.desktopdesktop.path = $${PREFIX}/share/applicationsINSTALLS += desktop
}

其中比较关键的是后面几行,指定 target.path、desktop.files 和 desktop.path。这其中 $$PREFIX 是 qmake 命令行传入的变量定义,可以理解为最后的安装路径,后面的构建步骤将会说明。

创建 linglong.yaml

构建玲珑包的关键就是 linglong.yaml 配置文件,我为这个应用程序创建的 linglong.yaml 文件内容如下:

version: "1"
package:id: net.mogoweb.qt-in-action.linglongdemoname: LingLongDemoversion: 0.0.0.1kind: appdescription: |simple LingLong Demo.
command:- /opt/apps/net.mogoweb.qt-in-action.linglongdemo/files/bin/LingLongDemobase: org.deepin.foundation/23.0.0
runtime: org.deepin.Runtime/23.0.1
source:- kind: local
build: |qmake LingLongDemo.pro CONFIG+=release PREFIX=${PREFIX} make -j${JOBS}make install

其中:

  • version: 版本,注意这里是玲珑的版本,而不是应用程序的版本,当前玲珑的版本为1

  • package

    • id: 应用程序的唯一id,为了避免冲突,一般用域名倒置加上应用程序包名

    • name: 应用程序名,这个名称是在玲珑包管理中展现的名称,并不是在开始菜单项中展现的名称。

    • version: 应用程序的版本号,一般要求4个用点分隔的数字

    • kind: 应用程序的类型,app 代表应用,runtime 则代表运行时

    • description: 应用程序描述

  • command: 应用程序执行路径,在 UOS 应用打包规范中,app 的 安装路径为: /opt/apps/<app_id>/files/bin/,所以这里的值为:/opt/apps/net.mogoweb.qt-in-action.linglongdemo/files/bin/LingLongDemo

  • base: 基础环境,因为玲珑应用是运行在容器中的,这里代表最小根文件系统,由 id 和版本号组成。先按照文档上的写。

  • runtime: 应用运行时依赖,我的理解就是一些运行时库,比如 libc、qt 之类的,先按照文档上填。

  • source: 在本项目中,是 local类型。但玲珑构建支持从 git 仓库下载资源并进行构建,这里先暂时不讨论。

  • build: 构建命令,在本例中是新建的 qmake 工程,所以使用 qmake 命令进行构建。${PREFIX} 是玲珑构建提供的环境变量之一,可在 variable、build 字段下使用,它提供构建时的安装路径,本例中值是 /opt/apps/net.mogoweb.qt-in-action.linglongdemo

编译、安装与运行

打开终端,进到 Qt 应用程序源码所在的目录,执行:

ll-builder build

注意这个过程中会联网下载基础环境和运行时环境,不要挂 VPN。挂 VPN 会导致基础环境和运行时环境库无法下载,且没有提示,我在这个地方卡了半天,最后才发现是这个问题。

849fb161b87a713d6b240aa8d0e70ed6.png

构建完成后,可以用命令先尝试者运行一下,看看有没有问题:

ll-builder run

因为是在 linglong.yaml 文件所在的目录下运行,所以不用指定参数也可以。

运行确定没问题后,就可以导出 玲珑包了。

ll-builder export

这个过程也是有些坑,要等待个几十秒,没任何输出,搞得我以为哪里又有问题。

导出的文件名为 appid.uab,所以本例中导出的文件为:

net.mogoweb.qt-in-action.linglongdemo_x86_64_0.0.0.1_main.uab

有了这个 uab 文件,就可以安装到系统中。

$ ll-cli install net.mogoweb.qt-in-action.linglongdemo_x86_64_0.0.0.1_main.uab 
(295763) ./libs/linglong/src/linglong/cli/cli.cpp:522 install from file "/work/mywork/qt-in-action/source/LingLongDemo/net.mogoweb.qt-in-action.linglongdemo_x86_64_0.0.0.1_main.uab"
100% install uab successfully

安装之后,在系统的起始菜单中就可以看到了。

a4276d77b5214fe8cf45034465e0b303.png

也可以通过玲珑构建工具查看系统安装了哪些玲珑应用:

(base) alex@alex-deepin-os:/work/mywork/qt-in-action/source/LingLongDemo$ ll-cli list
id                               name                             version         arch        channel         module      description
com.163.music                    com.163.music                    1.2.1.5         x86_64      main            runtime     网易云音乐是一款专注于发现与分享的音乐产品,主打发现...
com.baidu.baidunetdisk.linyaps   com.baidu.baidunetdisk           4.17.7.6        x86_64      main            binary      convert from 4.17.7 百度网盘
net.mogoweb.qt-in-action.linglongdemo LingLongDemo                     0.0.0.1         x86_64      main            binary      simple LingLong Demo.

通过玲珑构建工具卸载应用:

(base) alex@alex-deepin-os:/work/mywork/qt-in-action/source/LingLongDemo$ ll-cli uninstall net.mogoweb.qt-in-action.linglongdemo 
(base) alex@alex-deepin-os:/work/mywork/qt-in-action/source/LingLongDemo$ ll-cli list
id                               name                             version         arch        channel         module      description
com.163.music                    com.163.music                    1.2.1.5         x86_64      main            runtime     网易云音乐是一款专注于发现与分享的音乐产品,主打发现...
com.baidu.baidunetdisk.linyaps   com.baidu.baidunetdisk           4.17.7.6        x86_64      main            binary      convert from 4.17.7 百度网盘

以上命令均可以加上 --help 参数,查看更详细的使用方法。

小结

如意玲珑打包主要依赖 linglong.yaml 文件,由于文档的不完善,刚开始做玲珑包时还是走了一些弯路。上面用一个简单的Qt 应用程序的例子展示了基本流程。大家可能会发现,这个例子中,并没有打包所依赖的 Qt 库,而是使用了系统的 Qt 库。在实际的项目中,可能会使用比较新的 Qt 库,还有的项目可能会使用复杂的构建系统,也可能需要先 build 出应用程序,再来构建玲珑包,还可能有更复杂的环境等问题,这个在后面的文章中和大家分享,敬请关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/447493.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文 | Context-faithful Prompting for Large Language Models

主要内容&#xff1a; 这篇文章主要探讨了如何提高大型语言模型 (LLM) 在特定语境下的“忠诚度”&#xff0c;即模型是否能准确理解并提供与上下文相符的答案。文章关注了两个主要问题&#xff1a; 知识冲突&#xff1a; 当上下文中的事实与模型预训练数据中的事实不一致时&a…

ctf.bugku-eval

题目来源&#xff1a;eval - Bugku CTF 访问页面&#xff0c; 代码解释 <?phpinclude "flag.php"; //包含"flag.php"文件$a $_REQUEST[hello]; //从请求参数hello中获取值并赋给变量$a。 eval( "var_dump($a);"); //…

blender 记一下lattice

这个工具能够辅助你捏形状 这里演示如何操作BOX shift A分别创建俩对象一个BOX 一个就是lattice对象 然后在BOX的修改器内 创建一个叫做lattice的修改器 然后指定object为刚刚创建的lattice对象 这样就算绑定好了 接下来 进入lattice的编辑模式下 你选取一个点进行运动&#…

QT工程概述

在Qt中&#xff0c;创建 "MainWindow" 与 "Widget" 项目的主要区别在于他们的用途和功能范围&#xff1a; MainWindow&#xff1a;这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复 杂的应用程序&#xff0c;需要这些额外的用户…

LCD补充

LCD补充 目录 LCD补充 tip:随着我们学的越来越多&#xff0c;代码长度越来越长&#xff0c;编译越来越慢&#xff0c;有没有超过内存是我们比较关心的一件事&#xff0c;通过以下方法可以实时看到写的代码的大小 回顾LCD LCD补充功能 -- 1、有关在LCD上显示动图&#xff…

ERP系统有哪些实用的功能?

上一篇我们详细说了ERP是什么、ERP系统是什么&#xff0c;相信大家已经有了一定的了解&#xff0c;本篇文章我们将着重介绍ERP有哪些实用的功能。 首先&#xff0c;我们先来回顾一下上一篇的内容 什么是ERP?什么是ERP系统? 接下来进入本篇文章的重点内容 ERP系统一般有这些…

C语言—双链表

一、双向链表的结构 注意&#xff1a;这⾥的“带头”跟前⾯我们说的“头节点”是两个概念&#xff0c;实际前⾯在单链表阶段称呼不严谨&#xff0c;带头链表⾥的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这⾥“放哨的”…

论新能源智能化电动车个性化(高定)产品对制造生产的影响

一、新能源智能化电动车高定体现模式 1.个性体现在品牌之间 在不同主机产产品上体现&#xff0c;例如国产新能源新势力在智能座舱、内饰配置&#xff08;冰箱、彩电、大沙发&#xff09;方面对于合资品牌的碾压&#xff0c;提供更多细分&#xff0c;功能拉满的车型。 2.个性化…

PHP校园帮一键触达便捷无限小程序系统源码

校园帮小程序 —— 校园生活一键触达&#xff0c;便捷无限 &#x1f680;&#x1f4f1; &#x1f3eb; 一、校园生活新助手&#xff1a;校园帮小程序登场 在繁忙的校园生活中&#xff0c;你是否曾为找不到便捷的服务而烦恼&#xff1f;别担心&#xff0c;校园帮小程序来啦&am…

一篇闪击常用放大器电路(学习笔记)

文章目录 声明概念名词经典电路分析反向放大器同向放大器加法器减法器积分电路微分电路差分放大电路电流->电压转换电路电压->电流转换电路 虚短与虚断一、虚短二、虚断 一些碎碎念 声明 ​ 本文是主要基于以下两篇博客所做的笔记&#xff1a; 模电四&#xff1a;基本放…

端口号和netstat以及pidof

端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过netstat -n查看) 端口号范围划分 0 …

间隙波导2 用于宽带间隙波导技术的合适鲁棒性的嵌入式销钉床

摘要&#xff1a; 本文引入了一种新型的以嵌入式钉床形式的少接触电磁带隙结构。与传统的钉床结构相比&#xff0c;起初用于提供完美电导体边界的光滑的上层金属平面由周期缺口槽代替&#xff0c;并且在底层模块嵌入这些槽中的金属探针没有任何电接触。嵌入式EBG结构的优点之一…

pytorch学习笔记

文章目录 前言一、What is PyTorch二、Training Neural Networks三、Training&Testing Neural Networks四、Tensors五、Training&Testing Neural Networks六、torch.nn七、Neural Network Training Setup总结 前言 PyTorch 是一个流行的深度学习框架&#xff0c;具有动…

实战篇:(三)项目实战Vue 3 + WebGL 创建一个简单的 3D 渲染应用

Vue 3 WebGL 创建一个简单的 3D 渲染应用 我们将使用 Vue 3 和 WebGL 创建一个简单的 3D 渲染应用。项目将展示如何在 Vue 组件中集成 WebGL&#xff0c;并渲染一个旋转的立方体。 1. 项目准备 首先&#xff0c;确保你已经安装了 Node.js 和 Vue CLI。如果还没有安装&#x…

解密京东详情 API 接口:获取与运用指南

一、什么是京东详情API接口&#xff1f; 京东详情API接口是京东开放平台提供的一种服务&#xff0c;允许开发者通过编程方式获取商品的详细信息。通过调用这个接口&#xff0c;你可以获取到商品的基本信息、价格、库存、评价等数据。这些数据可以帮助你更好地了解商品的情况&a…

基于WebSocket实现简易即时通讯功能

代码实现 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifa…

2024最新分别用sklearn和NumPy设计k-近邻法对鸢尾花数据集进行分类(包含详细注解与可视化结果)

本文章代码实现以下功能&#xff1a; 利用sklearn设计实现k-近邻法。 利用NumPy设计实现k-近邻法。 将设计的k-近邻法对鸢尾花数据集进行分类&#xff0c;通过准确率来验证所设计算法的正确性&#xff0c;并将分类结果可视化。 评估k取不同值时算法的精度&#xff0c;并通过…

HTML CSS 基础

HTML & CSS 基础 HTML一、HTML简介1、网页1.1 什么是网页1.2 什么是HTML1.3 网页的形成1.4总结 2、web标准2.1 为什么需要web标准2.2 Web 标准的构成 二、HTML 标签1、HTML 语法规范1.1基本语法概述1.2 标签关系 2、 HTML 基本结构标签2.1 第一个 HTML 网页2.2 基本结构标签…

uniapp 游戏 - 使用 uniapp 实现的扫雷游戏

0. 思路 1. 效果图 2. 游戏规则 扫雷的规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的目标是避开雷,打开其他所有格子。一个非雷格中的数字表示其相邻 8 格子中的雷数,你可以利用这个信息推导出安全格和雷的位置。你可以用右键在你认为是雷的地方插旗(称为标…

中华春节符号·世界品牌——粤港澳企(实)业协会商会经济合作座谈会成功举办

日前&#xff0c;一场旨在推动粤港澳三地经济深度合作的盛会——《粤港澳企&#xff08;实&#xff09;业协会商会经济合作座谈会》在广州市天河区时代TIT广场2栋801车陂社区文化中心隆重举行。此次活动由泰康之家粤园与广东经贸文化促进会联合主办&#xff0c;吸引了全球华人企…