通过《如意玲珑应用构建指南(一):规范体系与配置文件全解析》的学习后,相信大家已经对玲珑应用构建工程基础知识有了一定的了解。在接下来的系列推文中,我们将深入实操环节,带大家利用所学知识正式构建玲珑应用。
本篇作为“如意玲珑应用构建从入门到实战”系列的第二篇,我们将以开源图形应用 qBittorrent 为例,为大家将演示如何进入玲珑容器、以及如何在玲珑容器中编译 qBittorrent 并测试运行。
01前期准备
根据玲珑应用构建工程通用资源的规范要求,我们应当为一款图形化应用同时提供保障桌面用户体验的 icons 图标文件及 desktop 启动文件。但本节实操演示仅在玲珑容器中进行编译、测试操作,因此暂时不需要准备通用资源。 本次分享基于 deepin 23 发行版,因此在进行以下任意步骤前均需要准备一个可以构建玲珑应用的 deepin 23 系统环境:
确保环境中已经安装 ll-builder 构建套件, 不同发行版安装方式参考如意玲珑安装教程[1];
由于在构建过程中我们需要联网获取玲珑容器的运行库以及可能需要的第三方库,因此我们需要保障全操作过程能够得到顺畅的网络连接;
在通过玲珑容器编译前, 最好先在比较接近本次构建容器的 deepin 23 中成功编译过 qBittorrent,以确保你对源代码编译有一定的了解
结合上一节玲珑应用构建工程 linglong.yaml 规范,并按照以下模板简单编写一版玲珑构建工程配置文件 linglong.yaml,以此来生成一个符合要求的容器。
主要有以下两个方面需要关注:
由于本次操作是直接进入容器进行操作,因此 build 部分的构建规则可不详细写;
由于本次涉及编译操作,为了能够极大程度包含所需的运行库,我们加入 runtime 段,具体编写规范参考《如意玲珑应用构建指南(一)》。
# SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: LGPL-3.0-or-later version: "4.6.7.2" package: id: org.qbittorrent.qBittorrent name: "qBittorrent" version: 4.6.7.2 kind: app description: | qBittorrent binary base: org.deepin.foundation/23.0.0 runtime: org.deepin.Runtime/23.0.1 command: - /opt/apps/org.qbittorrent.qBittorrent/files/bin/qbittorrent source: - kind: local name: "qBittorrent" build: | mkdir -p ${PREFIX}/bin/ ${PREFIX}/share/
02项目编译演示
在这里需要回顾一个知识点: 根据玲珑应用目录结构规范,与构建工程配置文件 linglong.yaml 同级的构建目录将被映射为 /project 目录。
万事俱备,我们就可以开始编译了
1. 为了方便操作,在构建目录下同时开启两个 shell 窗口,分别用于玲珑容器操作和普通操作。
2. 在完成准备 linglong.yaml 编辑后,我们就可以开始生成容器了,执行有限的操作以直接进入玲珑容器:
szbt@szbt-linyaps23:/media/szbt/Data/ll-build/QT/qBittorrent-git$ ll-builder build --exec bash路径发生类似以下变化时,即意味着我们已经进入玲珑容器中了。
szbt@szbt-linyaps23:/project$3.通过普通操作窗口解压 qBittorrent-4.6.7 源码到构建目录中,我这里单独解压到一个子目录中。
szbt@szbt-linyaps23:/media/szbt/Data/ll-build/QT/qBittorrent-git$ tar -xvf qBittorrent-4.6.7-git-origin-src.tar.zst -C src/
4. 源码解压后,根据玲珑应用构建基本步骤,我们在编译任意源代码前应该正确选择使用何种编译系统/工具。我们通过观察 qBittorrent-4.6.7 源码目录, 可以看到其存在 CMakeLists.txt 文件,这是 CMake 构建项目。

5.由于 qBittorrent INSTALL[2]中简要描述了本项目主要使用的运行库,因此我们可以对照此文档来判断哪些运行库存在与玲珑提供的 base、runtime 中,或哪些运行库并未被提供。对于暂未被正式提供的运行库,在编译主程序前我们可能需要先预编译必要的第三方库。
由于文档所述需要的运行库较少,此次我们可以先直接进行一次测试编译来确认运行库缺失情况。
6.通过玲珑容器操作窗口进入源码目录,为了尽量避免对源目录的干扰,我这里新建一个 build 目录用于编译。进入 build 目录后我们输入 CMake 相关配置参数来配置构建工程。
根据玲珑应用目录结构规范,我们将 DCMAKE_INSTALL_PREFIX 赋予 $PREFIX 的值,最终我在本地执行了以下操作:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX ..
7. 可以从图中看到,这里出现了一个错误导致无法完成配置。我们看到 pkg-config 出现错误:libtorrent-rasterbar>=1.2.19 库不能满足条件:

-- Found PkgConfig: /bin/pkg-config (found version "1.8.1") -- Checking for module 'libtorrent-rasterbar>=1.2.19'单独通过 pkg-config 亦无法获取该库的相关信息:
szbt@szbt-linyaps23:/project/src/qBittorrent-release-4.6.7-szbt2/build$ pkg-config --print-provides libtorrent-rasterbar
结合此报错,基本可以判断为该库缺失,因此我们需要在编译主程序前编译并安装此第三方库。
8. 返回普通操作窗口将 libtorrent-rasterbar>=1.2.19 库对应的源码下载到当前构建目录中,进入玲珑容器操作窗口重新编译。
9. 源码解压后,根据玲珑应用构建基本步骤,我们在编译任意源代码前应该正确选择使用何种编译系统/工具。我们通过观察 libtorrent-rasterbar-2.0.9 源码目录,可以看到其存在 CMakeLists.txt 文件,这是 CMake 构建项目。

10. 我们通过玲珑容器操作窗口进入源码目录,为了尽量避免对源目录的干扰,我这里新建一个 build 目录用于编译。进入 build 目录后我们输入 CMake 相关配置参数来配置构建工程。
根据玲珑应用目录结构规范,我们将 DCMAKE_INSTALL_PREFIX 赋予 $PREFIX 的值,最终我在本地执行了以下操作:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX .. make -j$(nproc) make install
可以看到, 第三方库 libtorrent-rasterbar-2.0.9 成功完成编译并安装到容器的 $PREFIX 目录中了,我们可以开启下一个操作。
11. 我们返回玲珑容器操作窗口进入 qBittorrent-4.6.7 源码目录,重新执行配置、编译、安装操作, 均不存在报错了。
03编译结果测试
流程结束后,在 $PREFIX 目录中找到该项目的二进制执行文件并在容器中运行测试,该二进制执行文件为: /opt/apps/org.qbittorrent.qBittorrent/files/bin/qbittorrent 注意,该操作需要在图形化桌面的终端操作,否则有可能无法调起程序的图形界面。
由下图可见并不是直接通过容器启动,发生了运行库无法找到的问题,因为报错的库也在 $PREFIX 中,因此我们直接通过变量 LD_LIBRARY_PATH 来指定动态运行库寻找路径。

由此可见,qBittorrent 已经成功在如意玲珑应用容器中成功编译并运行!
关于项目
如意玲珑(Linyaps)是一种新型的独立包管理工具集,专注于解决 Linux 系统下由传统软件包格式的复杂性和交叉依赖关系引起的兼容性问题。项目通过先进的隔离技术,将应用与系统完全解耦,从根本上解决因环境变化引发的应用兼容性问题,实现“一个架构,一次构建”,致力于简化软件开发流程、降低维护成本、加强数据安全,促进技术与平台间的协同合作,构建一个更加繁荣、安全和高效的 Linux 软件生态环境。
-
开源
+关注
关注
3文章
4031浏览量
45545 -
容器
+关注
关注
0文章
521浏览量
22808 -
编译
+关注
关注
0文章
687浏览量
34935
原文标题:如意玲珑应用构建指南(二):在玲珑容器中编译基于 Qt5 的开源应用
文章出处:【微信号:linux_deepin,微信公众号:深度操作系统】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
如何在Docker中创建容器
C6748程序测试运行速度很慢
倍福TwinCAT应用教程12.1 TwinCAT控制松下伺服 连接和试运行
如何在嵌入式容器Jetty或Tomcat中运行带有Maven的Java Web应用程序
大佬们,如何测试运行一条指令要多少时间?
为蓝牙RF测试测试运行edgefast_ blueooth_ shell,按下命令bt. init没有反应是怎么回事?
如何在Docker容器中运行Nginx
【经验分享】在Omni3576上编译Redis-8.0.2源码,并安装及性能测试

如何在玲珑容器中编译qBittorrent并测试运行
评论