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

news2024/11/30 14:24:41

在上一篇文章《国产系统之如意玲珑》中,我为大家介绍了一款创新的国产软件包管理工具——如意玲珑(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 gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += 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.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    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 += target

CONFIG(release) {
    message("Release build")
    desktop.files += hello-linglong.desktop
    desktop.path = $${PREFIX}/share/applications

    INSTALLS += desktop
}

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

创建 linglong.yaml

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

version: "1"
package:
  id: net.mogoweb.qt-in-action.linglongdemo
  name: LingLongDemo
  version: 0.0.0.1
  kind: app
  description: |
    simple LingLong Demo.
command:
  - /opt/apps/net.mogoweb.qt-in-action.linglongdemo/files/bin/LingLongDemo

base: 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.coloradmin.cn/o/2215391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python爬虫,爬取网页壁纸图片

python爬虫实战&#xff0c;爬取网页壁纸图片 使用python爬取壁纸图片&#xff0c;保存到本地。 爬取彼岸图网&#xff0c;网站地址https://pic.netbian.com/ 本人小白&#xff0c;记录一下学习过程。 开始前的准备 安装python环境&#xff0c;略。 python编辑器pycharm2…

Linux:防火墙相关命令使用(Ubuntu)

1.安装防火墙工具 虚拟机安装好系统后&#xff0c;默认是没有管理工具的。如果已经安装可以跳过。 # 安装ufw&#xff08;Uncomplicated Firewall&#xff09;&#xff0c;这是Ubuntu上管理防火墙的一个简单工具 sudo apt-get install ufw2.开启和关闭防火墙 # 开启防火墙 sud…

RuoYi-Vue若依框架-后端设置不登陆访问(白名单)

找到SecurityConfig类 确认自己的需求 /*** anyRequest | 匹配所有请求路径* access | SpringEl表达式结果为true时可以访问* anonymous | 匿名可以访问* denyAll | 用户不能访问* fullyAuthenticated | 用户完全认证可…

请速度收藏,Python爬虫必备的8大技巧!

想要快速学习爬虫&#xff0c;最值得学习的语言一定是Python&#xff0c;Python应用场景比较多&#xff0c;比如&#xff1a;Web快速开发、爬虫、自动化运维等等&#xff0c;可以做简单网站、自动发帖脚本、收发邮件脚本、简单验证码识别脚本。 爬虫在开发过程中也有很多复用的…

输电线路语义分割图像数据集,图片总共1200张左右,包含分割标签,json标签

输电线路语义分割图像数据集&#xff0c;图片总共1200张左右&#xff0c;包含分割标签&#xff0c;json标签 输电线路语义分割图像数据集介绍 数据集概述 名称&#xff1a;输电线路语义分割图像数据集图片数量&#xff1a;约1200张标注格式&#xff1a;JSON (包含像素级分割标…

中小型医院网站:Spring Boot开发策略

2 相关技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;…

迅速入门Pytorch深度学习框架

一、引言 随着人工智能技术的飞速发展&#xff0c;深度学习已成为当今科技领域的热门话题。PyTorch作为一款功能强大且易于使用的深度学习框架&#xff0c;受到了越来越多开发者和研究者的青睐。本文旨在帮助新手快速入门PyTorch&#xff0c;掌握其基本概念、核心功能以及实际…

【汇编语言】寄存器(内存访问)(三)—— 字的传送

文章目录 前言1. 字的传送2. 问题一3. 问题一的分析与解答4. 问题二5. 问题二的分析与解答结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言…

【LeetCode每日一题】——1588.所有奇数长度子数组的和

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 前缀和 二【题目难度】 简单 三【题目编号】 1588.所有奇数长度子数组的和 …

【AI系统】AI 学习方法与算法现状

在人工智能&#xff08;AI&#xff09;的漫长历史中&#xff0c;我们见证了从早期的规则驱动系统到现代的机器学习模型的转变。AI的学习方法是其进步的核心&#xff0c;而算法现状则反映了当前技术的高度和未来的发展方向。 Ⅰ.AI 学习方法 AI的工作原理基于深度神经网络&…

源码编译llama.cpp for windows on arm

源码编译llama.cpp for windows on arm 这里有编译好的&#xff0c;直接下载使用 https://github.com/turingevo/llama.cpp-build/releases 1 先编译openblas for windows on arm 查看我的文章 《源码编译 openblas for windows on arm》 2 启用OpenBlas加速 上一步openb…

A0002.主机访问虚拟机中windows系统时,ping不通问题解决

问题再现 解决方法 查看主机的IP地址及DNS 在虚拟机中设置IP地址和DNS

leetcode计数排序

计数排序&#xff08;counting sort&#xff09;通过统计元素数量来实现排序&#xff0c;通常应用于整数数组。 给定一个长度为 的数组 nums &#xff0c;其中的元素都是“非负整数” def counting_sort(nums: list[int]):"""计数排序"""# 完整实…

设置 Notepad++ 制表符(Tab 缩进)宽度为2个空格大小

Notepad 默认的制表符宽度是 4 个空格的大小&#xff0c;一个规模比较大的代码段或者 xml 等文件&#xff0c;小屏幕打开时看到的情景真的和让人着急&#xff0c;拖来拖去&#xff01;有两种方案可以解决这种情况。 修改缩进为空格 这种我们不太推荐&#xff0c;但是有些公司…

【Vue】Vue3.0(十一)Vue 3.0 中 computed 计算属性概念、使用及示例

上篇文章&#xff1a;【Vue】Vue3.0&#xff08;十&#xff09;toRefs()和toRef()的区别及使用示例 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年10月15日10点23分 文章目录 Vue 3.0中…

IDC《中国网络安全软件技术发展路线图,2024》报告身份管理 移动安全推荐厂商

10月9日&#xff0c;全球知名研究与分析机构IDC发布了《IDC TechScape&#xff1a;中国网络安全软件技术发展路线图&#xff0c;2024》报告&#xff0c;深入剖析了中国网络安全软件市场的现状与未来趋势。芯盾时代作为领先的零信任业务安全产品方案提供商&#xff0c;凭借在身份…

FFmpeg 4.3 音视频基础到工程应用-多路H265监控录放C++开发一 : 环境搭建1 vs2019 安装,

一 VS2019安装 https://pan.baidu.com/s/1CtMOM5Zhu-HcHcj611edOg#list/path%2F 密码 p668 二 菜单运行vs2019编译控制台 如果我们要build 32 位的程序&#xff0c;则使用 如果我们要build 64 位的ffmpeg&#xff0c;则使用 x64 Navite Tools Command Prompt for VS 2019 我们…

红日靶机(四)笔记

VulnStack-红日靶机四 概述 这个靶场环境包含了三台机器&#xff0c;一台web&#xff0c;两台window域机器。web服务是使用docker容器搭建的&#xff0c;所以就涉及到docker逃逸。而在获得立足点的过程中&#xff0c;我们要对三个docker容器分别测试&#xff0c;不能漏掉可以…

2012年国赛高教杯数学建模C题脑卒中发病环境因素分析及干预解题全过程文档及程序

2012年国赛高教杯数学建模 C题 脑卒中发病环境因素分析及干预 脑卒中&#xff08;俗称脑中风&#xff09;是目前威胁人类生命的严重疾病之一&#xff0c;它的发生是一个漫长的过程&#xff0c;一旦得病就很难逆转。这种疾病的诱发已经被证实与环境因素&#xff0c;包括气温和湿…

Ubuntu内存扩容

目录 vmware设置Ubuntu设置查看 读研后发现&#xff0c;Ubuntu的使用量直线上升&#xff0c;之前给配置了20g内存&#xff0c;安装了个ros后&#xff0c;没啥内存了。本文实现给Ubuntu扩容。 vmware设置 这里 我使用别人的截图来演示。 我在这里改成了60 Ubuntu设置 sudo a…