Lycium++ - OpenHarmony PC C/C++ 增强编译框架

Lycium++ - OpenHarmony PC C/C++ 增强编译框架

📋 目录


项目简介

Lycium++ 是基于 OpenHarmony PC C/C++ 编译框架 Lycium 的增强版本,提供更强大的自动化构建能力和依赖管理功能。

与原生 Lycium 的区别

特性 Lycium(原生) Lycium++(增强)
依赖自动构建 ✅ 一键构建依赖树
多版本支持 ✅ 支持多版本共存
外部仓库 ✅ 独立仓库管理
HNP 打包 ✅ 原生支持
macOS 支持 ⚠️ 部分 ✅ 完全支持

核心特性

✅ 已实现功能

1. 📦 智能依赖管理
  • 自动构建依赖关系树

  • 一键编译所有依赖库

  • 智能循环依赖检测

2. 🔄 多版本构建能力
  • 支持同一库的多个版本

  • 独立的代码仓库管理

  • 通过外部源码仓获取编译

3. 📥 HNP 产物生成
  • 生成 HarmonyOS Native Package

  • 支持在 HarmonyOS 系统直接使用

  • 自动打包和归档

🚧 规划中功能

4. 📄 开源声明聚合
  • 自动收集所有依赖的开源协议

  • 生成 HTML 格式的声明文件

  • 符合开源合规要求


快速开始

环境准备

系统要求
项目 要求
操作系统 macOS 12+, Linux (Ubuntu 18.04+), HarmonyOS
磁盘空间 至少 10GB 可用空间
内存 建议 8GB 以上
网络 需要访问外网下载源码
必需工具

所有平台通用:

复制代码
# 基础编译工具
gcc g++ cmake make
​
# 自动化工具
autoconf automake libtool pkg-config
​
# 辅助工具
git wget curl tar unzip patch
​
# 构建工具
ninja

macOS 环境配置

第 1 步:安装 Homebrew

如果还未安装 Homebrew:

复制代码
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
第 2 步:安装必需工具
复制代码
# 安装所有必需工具(一键安装)
brew install cmake autoconf automake libtool pkg-config
brew install ninja wget coreutils
​
# 验证安装
cmake --version
ninja --version
pkg-config --version
sha512sum --version  # 来自 coreutils
第 3 步:下载 OpenHarmony SDK

方式一:通过 DevEco Studio(推荐)

  1. 下载并安装 DevEco Studio

  2. 打开 DevEco Studio

  3. 进入 ToolsSDK Manager

  4. 选择 OpenHarmony SDK

  5. 勾选 Native 开发套件

  6. 点击 Apply 下载

方式二:命令行下载

访问 OpenHarmony SDK 下载页 手动下载。

第 4 步:配置环境变量

~/.zshrc~/.bash_profile 中添加:

复制代码
# OpenHarmony SDK 路径(根据实际安装路径修改)
export OHOS_SDK="/Users/$(whoami)/Library/OpenHarmony/Sdk/20"
​
# 添加 CMake 到 PATH(可选,方便使用)
export PATH="$OHOS_SDK/native/build-tools/cmake/bin:$PATH"
​
# 设置 HNP 工具路径(如果需要打包 HNP)
export HNP_TOOL="/path/to/hnp-tool"  # 根据实际路径修改

使配置生效:

复制代码
source ~/.zshrc
第 5 步:验证环境
复制代码
# 验证 SDK 路径
echo $OHOS_SDK
ls $OHOS_SDK/native/llvm/bin/clang
​
# 验证编译器
$OHOS_SDK/native/llvm/bin/clang --version
​
# 验证 CMake
$OHOS_SDK/native/build-tools/cmake/bin/cmake --version

预期输出:

复制代码
LLVM version 15.0.4
...
cmake version 3.16.5

首次编译

克隆项目
复制代码
git clone https://gitcode.com/your-repo/lycium_plusplus.git
cd lycium_plusplus
快速测试

编译一个简单的库来验证环境:

复制代码
cd lycium
./build.sh zlib

如果成功,会看到类似输出:

复制代码
Build OS Darwin
OHOS_SDK=/Users/username/Library/OpenHarmony/Sdk/20
CLANG_VERSION=15.0.4
Start building zlib 1.3.1!
Compileing OpenHarmony arm64-v8a zlib 1.3.1 libs...
...
Build zlib 1.3.1 end!
ALL JOBS DONE!!!
查看编译产物
复制代码
ls -lh usr/zlib/arm64-v8a/

应该看到:

复制代码
include/    # 头文件
lib/        # 库文件
share/      # 文档

使用指南

原生构建方式

原生方式使用 lycium 框架编译 communitythirdparty 目录中已存在的三方库。

编译单个库
复制代码
cd lycium
./build.sh zlib
编译多个库
复制代码
./build.sh zlib openssl curl
编译所有库
复制代码
./build.sh
查看编译日志
复制代码
# 实时查看
tail -f lycium_build_intl.log
​
# 查看完整日志
cat lycium_build_intl.log

增强型构建方式

增强型方式支持外部独立仓库参与构建,实现更灵活的版本管理。

架构示意
复制代码
lycium_plusplus/
├── lycium/                    # 主构建系统
│   ├── build.sh              # 构建脚本
│   ├── community/            # 社区库(软链接)
│   ├── thirdparty/           # 第三方库(软链接)
│   └── usr/                  # 编译产物
├── community/                 # 社区库实际目录
├── thirdparty/               # 第三方库实际目录
└── outerrepo/                # 外部仓库
    ├── module.json           # 外部仓库配置
    └── tree/                 # 动态下载的外部仓库
工作流程
复制代码

不存在

存在

./build.sh tree

检查 outerrepo/tree

读取 module.json

Git Clone 仓库

切换到指定分支

准备编译环境

执行 HPKBUILD

编译产物

有 archive?

生成 HNP

完成


外部仓库管理

module.json 配置文件

外部仓库信息存放在 outerrepo/module.json 中。

配置示例
复制代码
{
    "modules": [
        {
            "name": "tree",
            "version": "2.2.1",
            "branch": "ohos_2.2.1",
            "type": "git",
            "url": "https://gitcode.com/OpenHarmonyPCDeveloper/ohos_tree.git"
        },
        {
            "name": "another-lib",
            "version": "1.0.0",
            "branch": "main",
            "type": "git",
            "url": "https://github.com/user/another-lib-ohos.git"
        }
    ]
}
配置字段说明
字段 说明 必需 示例
name 模块名称,必须与 HPKBUILD 中的 pkgname 一致 tree
version 原生库版本号 2.2.1
branch 适配仓库的分支名 ohos_2.2.1
type 源码获取方式 git
url 代码仓库地址 https://...

外部 Ports 仓规范

外部代码仓应遵循以下目录结构:

复制代码
ohos_tree/                         # 仓库名
├── HPKBUILD                       # 必需:构建配置
├── HPKCHECK                       # 可选:测试脚本
├── hnp.json                       # 可选:HNP 打包配置
├── README.md                      # 推荐:说明文档
├── 0001-ports-for-ohos.patch    # 可选:补丁文件
└── SHA512SUM                      # 推荐:校验和文件
HPKBUILD 示例
复制代码
# Contributor: Your Name <your.email@example.com>
# Maintainer: Your Name <your.email@example.com>
​
pkgname=tree
pkgver=2.2.1
pkgrel=0
pkgdesc="A directory listing program displaying a depth indented list of files"
url="http://mama.indstate.edu/users/ice/tree/"
archs=("armeabi-v7a" "arm64-v8a")
license=("GPL")
depends=()
makedepends=("make" "patch")
source="https://github.com/Old-Man-Programmer/tree/archive/refs/tags/${pkgver}.tar.gz"
​
downloadpackage=true
autounpack=true
buildtools="make"
​
builddir="tree-${pkgver}"
packagename="${pkgver}.tar.gz"
​
prepare() {
    cd $builddir
    # 应用补丁
    patch -p1 < ../0001-ports-for-ohos.patch
    cd ${OLDPWD}
}
​
build() {
    cd $builddir
    
    # 设置编译器
    export CC="${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang"
    export CFLAGS="-target aarch64-linux-ohos --sysroot=${SYSROOT}"
    
    # 编译
    make -j8
    
    ret=$?
    cd $OLDPWD
    return $ret
}
​
package() {
    cd $builddir
    
    # 安装
    install -Dm755 tree "$LYCIUM_ROOT/usr/$pkgname/$ARCH/bin/tree"
    install -Dm644 doc/tree.1 "$LYCIUM_ROOT/usr/$pkgname/$ARCH/share/man/man1/tree.1"
    
    cd $OLDPWD
}
​
# 归档阶段(可选,用于生成 HNP)
archive() {
    mkdir -p ${LYCIUM_ROOT}/output/$ARCH
    
    # 打包 tar.gz
    pushd $LYCIUM_ROOT/usr/$pkgname/$ARCH
    tar -czf ${LYCIUM_ROOT}/output/$ARCH/${pkgname}_${pkgver}.tar.gz *
    popd
    
    # 复制 HNP 配置
    cp hnp.json $LYCIUM_ROOT/usr/$pkgname/$ARCH/
    
    # 生成 HNP 包
    ${HNP_TOOL} pack -i ${LYCIUM_ROOT}/usr/$pkgname/$ARCH \
                     -o ${LYCIUM_ROOT}/output/$ARCH/
}
​
check() {
    echo "The test must be on an OpenHarmony device!"
}
​
cleanbuild() {
    rm -rf ${PWD}/$builddir
}
hnp.json 配置
复制代码
{
    "type": "hnp-config",
    "name": "tree",
    "version": "2.2.1",
    "description": "A directory listing program",
    "license": "GPL",
    "install": {
        "bin": ["bin/tree"],
        "man": ["share/man/man1/tree.1"]
    }
}

使用外部仓库

第 1 步:配置 module.json

outerrepo/module.json 中添加模块配置。

第 2 步:执行编译
复制代码
cd lycium
./build.sh tree
第 3 步:自动化流程

构建系统会自动:

  1. 检查 outerrepo/tree 是否存在

  2. 如不存在,读取 module.json 配置

  3. 执行 git clone -b <branch> <url> tree

  4. 执行标准的 lycium 编译流程


HNP 打包

什么是 HNP?

HNP (HarmonyOS Native Package) 是 HarmonyOS 的原生包格式,可以直接在 HarmonyOS 系统上安装和使用。

打包流程

1. 在 HPKBUILD 中添加 archive() 函数
复制代码
archive() {
    # 创建输出目录
    mkdir -p ${LYCIUM_ROOT}/output/$ARCH
    
    # 打包二进制文件
    pushd $LYCIUM_ROOT/usr/$pkgname/$ARCH
    tar -czf ${LYCIUM_ROOT}/output/$ARCH/${pkgname}_${pkgver}.tar.gz *
    popd
    
    # 复制 HNP 配置
    cp hnp.json $LYCIUM_ROOT/usr/$pkgname/$ARCH/
    
    # 生成 HNP 包
    ${HNP_TOOL} pack \
        -i ${LYCIUM_ROOT}/usr/$pkgname/$ARCH \
        -o ${LYCIUM_ROOT}/output/$ARCH/
}
2. 执行编译
复制代码
./build.sh tree
3. 获取产物

编译完成后,可以在以下位置获取产物:

二进制产物:

复制代码
lycium/usr/tree/<ARCH>/
├── bin/          # 可执行文件
├── lib/          # 库文件
├── include/      # 头文件
└── share/        # 文档等

归档产物:

复制代码
lycium/output/<ARCH>/
├── tree_2.2.1.tar.gz    # tar 归档
└── tree_2.2.1.hnp       # HNP 包

HNP 安装

在 HarmonyOS 设备上:

复制代码
# 使用 hnp 工具安装
hnp install tree_2.2.1.hnp
​
# 或使用 hdc 推送后安装
hdc file send tree_2.2.1.hnp /data/local/tmp/
hdc shell
hnp install /data/local/tmp/tree_2.2.1.hnp

常见问题

macOS 环境相关

Q1: cp: the -R and -r options may not be specified together

原因:macOS 的 BSD cp 命令参数检查更严格。

解决:已在最新版本中修复。如果仍遇到,请更新到最新代码:

复制代码
git pull origin main

详见:<docs/fix-cp-error.md>

Q2: pkg-config 命令未安装

解决

复制代码
brew install pkg-config
Q3: ninja 命令未安装

解决

复制代码
brew install ninja
Q4: wget 命令未安装

解决

复制代码
brew install wget
Q5: sha512sum: command not found

原因 :macOS 默认没有 sha512sum 命令。

解决

复制代码
brew install coreutils

编译问题

Q6: OHOS_SDK 未设置

解决

复制代码
# 设置环境变量
export OHOS_SDK="/Users/$(whoami)/Library/OpenHarmony/Sdk/20"
​
# 或添加到 ~/.zshrc
echo 'export OHOS_SDK="/Users/$(whoami)/Library/OpenHarmony/Sdk/20"' >> ~/.zshrc
source ~/.zshrc
Q7: 编译时找不到依赖库

现象

复制代码
CMake Error: Could not find package "ZLIB"

解决

复制代码
# 先编译依赖
./build.sh zlib
​
# 再编译目标库
./build.sh target-lib
Q8: SHA512 校验失败

解决

复制代码
# 删除旧的源码包
rm thirdparty/pkgname/*.tar.gz
​
# 重新编译(会自动下载)
./build.sh pkgname

外部仓库问题

Q9: Git clone 失败

可能原因

  1. 网络问题

  2. 仓库地址错误

  3. 分支不存在

解决

复制代码
# 手动克隆测试
cd outerrepo
git clone -b <branch> <url> <name>
​
# 检查分支
cd <name>
git branch -a
Q10: 外部仓库编译失败

排查步骤

  1. 检查 HPKBUILD 语法

  2. 查看编译日志

  3. 手动进入目录测试

复制代码
cd outerrepo/pkgname
source HPKBUILD
prepare
build

贡献指南

如何贡献

我们欢迎所有形式的贡献!

贡献新的库适配
  1. Fork 本项目

  2. 创建适配仓库(或在本地 thirdparty 目录)

  3. 编写 HPKBUILD 和 HPKCHECK

  4. 测试编译和运行

  5. 提交 Pull Request

报告问题

发现 Bug?请在 Issues 中报告,并包含:

  • 操作系统和版本

  • OHOS SDK 版本

  • 完整的错误日志

  • 复现步骤

完善文档

文档改进也是重要的贡献!

代码规范

  • Shell 脚本使用 4 空格缩进

  • 函数名使用小写加下划线

  • 添加必要的注释

  • 遵循现有代码风格


测试验证

在 OpenHarmony 设备上测试

1. 准备测试环境

参考 <lycium/CItools/README_zh.md> 搭建测试环境。

2. 推送代码到设备
复制代码
# 压缩整个项目
tar -czf lycium_plusplus.tar.gz lycium_plusplus/
​
# 推送到设备
hdc file send lycium_plusplus.tar.gz /data/local/tmp/
​
# 连接设备
hdc shell
cd /data/local/tmp
tar -xzf lycium_plusplus.tar.gz
3. 执行测试
复制代码
cd lycium_plusplus/lycium
./test.sh tree
4. 查看测试结果
复制代码
cat check_result/check_log/tree_*_test.log

参考资源

官方文档

本项目文档

学习资源


许可证

本项目采用 Apache License 2.0 许可证。详见 LICENSE 文件。


致谢

感谢以下项目和组织:

完毕

相关推荐
再__努力1点2 小时前
【77】积分图像:快速计算矩形区域和核心逻辑
开发语言·图像处理·人工智能·python·算法·计算机视觉
Evand J3 小时前
【2026课题推荐】基于小波/互相关/FFT的卡尔曼滤波的轨迹估计,及MATLAB例程的运行结果
开发语言·matlab·目标跟踪·轨迹跟踪
独自归家的兔3 小时前
Java Robot 详解:系统级鼠标 / 键盘模拟的核心原理与实战
java·开发语言
小灰灰搞电子3 小时前
Qt 开发环境选择Qt Creator、Visual Studio还是 VS Code?
开发语言·qt·visual studio
何中应3 小时前
Bean的三种注入方式
开发语言·spring boot·后端·spring
胖咕噜的稞达鸭3 小时前
算法日记专题:位运算II( 只出现一次的数字I II III 面试题:消失的两个数字 比特位计数)
c++·算法·动态规划
fantasy_arch3 小时前
pd_process.c 文件源码分析
c语言·数据库·视频编解码·av1
茉莉玫瑰花茶3 小时前
ProtoBuf - 3
服务器·c++·protobuf
wanghowie3 小时前
01.03 Java基础篇|面向对象核心与设计实践
java·开发语言