通过《如意玲珑应用构建指南(一):规范体系与配置文件全解析》的学习后,相信大家已经对玲珑应用构建工程基础知识有了一定的了解。 在接下来的系列推文中,我们将深入实操环节,带大家利用所学知识正式构建玲珑应用。

本篇作为“如意玲珑应用构建从入门到实战”系列的第二篇,我们将以开源图形应用 qBittorrent 为例,为大家将演示如何进入玲珑容器、以及如何在玲珑容器中编译 qBittorrent  并测试运行。

01 前期准备

根据玲珑应用构建工程通用资源的规范要求,我们应当为一款图形化应用同时提供保障桌面用户体验的 icons 图标文件及 desktop 启动文件。但本节实操演示仅在玲珑容器中进行编译、测试操作,因此暂时不需要准备通用资源。本次分享基于 deepin 23 发行版,因此在进行以下任意步骤前均需要准备一个可以构建玲珑应用的 deepin 23 系统环境:

  1. 确保环境中已经安装 ll-builder 构建套件, 不同发行版安装方式参考如意玲珑安装教程[1]
  2. 由于在构建过程中我们需要联网获取玲珑容器的运行库以及可能需要的第三方库,因此我们需要保障全操作过程能够得到顺畅的网络连接;
  3. 在通过玲珑容器编译前, 最好先在比较接近本次构建容器的 deepin 23 中成功编译过 qBittorrent,以确保你对源代码编译有一定的了解
  4. 结合上一节玲珑应用构建工程  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 已经成功在如意玲珑应用容器中成功编译并运行!


以上便是在玲珑容器中编译基于 Qt5 的开源应用的全流程,欢迎大家上手体验!


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注