【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置

系列导读:本文是 Lycium 适配系列的第一篇,介绍 Lycium 框架的核心概念、适配工作本质,以及如何搭建完整的交叉编译环境。

欢迎加入【开源鸿蒙PC社区】,一起共建鸿蒙化C/C++三方库生态。

前言

项目 说明
macOS环境配置 https://bxming.blog.csdn.net/article/details/159284830
Ubuntu环境配置(或者windows + wsl) https://bxming.blog.csdn.net /article/details/159284760
lycium框架 https://atomgit.com/OpenHarmonyPCDeveloper/lycium_plusplus.git
应用平台 HarmonyOS PC

系列索引

篇章 标题 内容
第一篇 概述与环境配置 Lycium 概念、构建机要求、OHOS SDK 配置
第二篇 项目结构与适配目录创建 目录结构、community vs thirdparty、创建适配目录
第三篇 HPKBUILD 编写详解 元数据字段、过程函数、三种构建系统写法
第四篇 构建执行与产物获取 构建流程、日志分析、多库递归、HAP 集成
第五篇 流程图与角色职责 完整流程图、各角色职责、协作时序
第六篇 关键注意事项与最佳实践 依赖管理、架构超集、日志调试、外部适配仓
第七篇 快速参考与模板 入门步骤、模板、完整案例、检查清单

1. 什么是 Lycium?

Lycium 是 OpenHarmony 官方提供的 C/C++ 三方库交叉编译框架

一句话概括 :Lycium 的角色类似于嵌入式领域的 Buildroot 或 Yocto,但更轻量------它只做一件事:将上游开源的 C/C++ 库,编译成可在 OpenHarmony 设备上运行的二进制文件(.so 动态库 / .a 静态库)

核心设计思想

Lycium 的设计深受 Arch Linux 的 PKGBUILD 影响:

  • 每个库对应一个 HPKBUILD 描述文件(类比 PKGBUILD)
  • 元数据是声明式的:库名、版本、架构、依赖等用变量定义
  • 构建逻辑是过程式的:prepare、build、package 等阶段用 shell 函数实现
  • 框架负责编排 (下载、解压、设置工具链、循环多架构),适配者只负责告诉框架怎么做

典型适配场景

场景 说明
新增一个开源库 将 curl、sqlite、openssl 等 C 库移植到 OH
升级库版本 修改 pkgver,必要时调整 build() 中的 API 变更
修复构建失败 上游代码不兼容 OH 时,通过 patch 打补丁或修改 build() 参数
添加新架构 archs 中添加 "arm64-v8a"

2. 构建环境要求

2.1 构建机(开发主机)

可以选择 Linux(Ubuntu 22.04+)macOSWindows + WSL/Linux虚拟机 、以及HarmonyOS PC其一。本篇文章选择使用macOS作为开发主机。

必需工具一览
工具/组件 角色 说明
gcc / clang 本机编译器 构建本机辅助工具,部分 makedepends 命令检测
cmake (≥3.16) 构建系统 CMake 项目的构建工具,Lycium 会使用 OHOS SDK 中定制的 cmake
make 构建系统 Makefile 项目的构建驱动,build_hpk.sh 中默认 make -j$(nproc)
ninja 构建系统 Ninja 项目构建驱动,某些 CMake 项目生成器选择 Ninja
pkg-config 依赖定位 configure/cmake 项目查找已安装库的 .pc 文件
autoconf / autoreconf / automake 构建系统 autotools 项目的构建工具链(生成 configure 脚本)
wget 源码下载 下载上游源码压缩包
sha512sum 完整性校验 校验源码包哈希值(coreutils 自带)
git 源码/适配仓获取 克隆外部适配仓、应用 patch
Ubuntu 一键安装
shell 复制代码
sudo apt install gcc cmake make ninja-build pkg-config autoconf automake wget
macOS 注意事项

macOS 上需要额外注意:

  • 工具链使用 OHOS SDK 中的交叉编译器,不需要 Xcode Clang
  • sha512sum 在 macOS 上需通过 brew install coreutils 安装
  • pkg-config 通过 brew install pkg-config 安装
  • 文件路径、sed 语法与 Linux 有差异,注意 build() 函数中的兼容性

2.2 OpenHarmony SDK(OHOS_SDK)

这是适配工作中最关键的外部依赖。SDK 提供了:

  1. 交叉编译器(arm-linux-ohos-clang、aarch64-linux-ohos-clang 等)
  2. LLVM 工具链(ld.lld、llvm-ar、llvm-strip、llvm-ranlib、llvm-nm、llvm-objcopy 等)
  3. CMake + 交叉编译 toolchain 文件ohos.toolchain.cmake
  4. musl libc sysroot(OpenHarmony 系统 C 库头文件和库)
  5. HNP 打包工具(hnpcli,用于生成鸿蒙 Native Package)
SDK 目录结构详解
复制代码
${OHOS_SDK}/
├── native/
│   ├── llvm/bin/
│   │   ├── arm-linux-ohos-clang          # armeabi-v7a C 编译器
│   │   ├── arm-linux-ohos-clang++        # armeabi-v7a C++ 编译器
│   │   ├── aarch64-linux-ohos-clang      # arm64-v8a C 编译器
│   │   ├── aarch64-linux-ohos-clang++    # arm64-v8a C++ 编译器
│   │   ├── x86_64-linux-ohos-clang       # x86_64 C 编译器(模拟器用)
│   │   ├── x86_64-linux-ohos-clang++     # x86_64 C++ 编译器
│   │   ├── ld.lld                        # LLVM 链接器
│   │   ├── llvm-ar                       # 静态库归档工具
│   │   ├── llvm-strip                    # 符号剥离工具
│   │   ├── llvm-ranlib                   # 静态库索引生成
│   │   ├── llvm-nm                       # 符号查看工具
│   │   └── llvm-objcopy / llvm-objdump   # 目标文件操作工具
│   ├── build-tools/cmake/bin/
│   │   └── cmake                         # OHOS 定制的 cmake(内嵌 toolchain 配置)
│   ├── build-tools/cmake/share/
│   │   └── ohos.toolchain.cmake          # CMake 交叉编译 toolchain 文件
│   └── sysroot/                          # OpenHarmony musl libc 系统头文件和库
└── toolchains/
    └── hnpcli                            # HNP 打包工具(生成鸿蒙 Native Package)

各组件作用详解

组件 路径 作用
交叉编译器 llvm/bin/ 将 x86_64 主机上的 C/C++ 代码编译为 ARM/ARM64 可执行文件
LLVM 工具链 llvm/bin/ 链接、归档、符号剥离等后处理操作,与编译器保持版本一致
定制 CMake build-tools/cmake/bin/cmake 内嵌 OHOS toolchain 配置,自动识别 OHOS 目标平台
sysroot sysroot/ OHOS 的 C 库(musl libc)头文件和系统库,交叉编译时的"目标系统根目录"
hnpcli toolchains/hnpcli 鸿蒙 Native Package 命令行打包工具,将 .so/.a/.h 打包为 .hnp 格式

注意OHOS_SDK 环境变量需要指向 native/ 目录的父目录 ,而不是 native/ 内部。

环境变量设置

Lycium 通过 lycium/script/envset.sh 中的函数为不同架构自动设置环境变量:

函数 目标架构
setarm32ENV() armeabi-v7a(32位 ARM)
setarm64ENV() arm64-v8a(64位 ARM,含 --sysroot
setx86_64ENV() x86_64(模拟器)
setHarmonyOSENV() 鸿蒙本机构建(DevBox)

鸿蒙本机构建(DevBox) :当直接在 OpenHarmony 设备上构建时(而非主机交叉编译),使用 setHarmonyOSENV()。该函数设置 TARGET_HARMONYOS=true,仅构建 arm64-v8a 架构,编译器使用设备本地 clang。对应入口脚本为 build_local.sh

shell 复制代码
./build_local.sh <pkgname>

arm64-v8a 为例,设置的核心环境变量:

shell 复制代码
export CC=aarch64-linux-ohos-clang
export CXX=aarch64-linux-ohos-clang++
export AR=llvm-ar
export LD=ld.lld
export STRIP=llvm-strip
export CFLAGS="-DOHOS_NDK -fPIC -D__MUSL__=1 -D__OHOS__ --sysroot=${SYSROOT}"
export CXXFLAGS="${CFLAGS}"
export SYSROOT="${OHOS_SDK}/native/sysroot"
配置 SDK
shell 复制代码
# 设置环境变量(建议写入 ~/.bashrc 或 ~/.zshrc)
export OHOS_SDK=/home/user/ohos-sdk/linux

# 验证
ls $OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang
# 输出:/home/user/ohos-sdk/linux/native/llvm/bin/aarch64-linux-ohos-clang

2.3 目标架构

OpenHarmony 当前主要支持以下 CPU 架构:

架构 archs 编译器三元组 说明
32位 ARM armeabi-v7a arm-linux-ohos 旧设备/低端设备(IoT)
64位 ARM arm64-v8a aarch64-linux-ohos 主流设备(手机、平板、TV)
x86_64 x86_64 x86_64-linux-ohos 模拟器/特定设备

实际适配中的建议

  • 如果没有特殊需求,至少适配 arm64-v8a(当前绝大多数 OH 设备)
  • 同时支持 armeabi-v7a 可覆盖更多存量设备
  • x86_64 主要用于模拟器调试,按需添加

3. 环境验证:快速跑通第一个库

在进入正式的适配流程之前,建议先验证环境是否正确。最简单的验证方式是构建一个 Lycium 官方已经适配好的库(如 cJSON):

shell 复制代码
# 1. 确保 OHOS_SDK 已设置
export OHOS_SDK=/path/to/ohos-sdk/linux

# 2. 获取框架代码
git clone https://atomgit.com/OpenHarmonyPCDeveloper/lycium_plusplus.git
cd lycium_plusplus
# 3. 构建一个已验证的库
./build.sh cJSON

如果构建成功,lycium/usr/cJSON/ 下会出现 arm64-v8a/ 等架构目录,包含 include/lib/ 等产物。

💡 常见环境问题排查

  • OHOS_SDK 未设置 → 在 build.sh 中会报 "not set yet" 错误
  • cmake 版本过低 → 使用 SDK 自带的 cmake ($OHOS_SDK/native/build-tools/cmake/bin/cmake)
  • 缺少 sha512sum → macOS 上 brew install coreutils,Linux 上 apt install coreutils

下篇预告

环境就绪后,下一篇文章将介绍 Lycium 的项目目录结构,以及如何创建库的适配目录、编写必要的文件(README.OpenSource、SHA512SUM、OAT.xml 等)。

相关推荐
十五年专注C++开发1 分钟前
CMake实践:VS2019控制台程序隐藏控制台方法
c++·windows·cmake·控制台隐藏
AI视觉网奇3 分钟前
Bambu Studio 发现 xx个开放边
开发语言·人工智能·python
小欣加油4 分钟前
leetcode3635 最早完成陆地和水上游乐设施的时间II
数据结构·c++·算法·leetcode
qq_4581482010 分钟前
科大讯飞实时语音识别(rtasr)真实项目踩坑经验总结与手把手教学真实可运行Demo
java·开发语言·websocket·语音识别
三品吉他手会点灯10 分钟前
C语言学习笔记 - 46.运算符和表达式 - 运算符4 - 对初学运算符的一些建议
c语言·开发语言·笔记·学习
QT-Neal13 分钟前
链接和库整理
c++
创业之路&下一个五年13 分钟前
mvvm中v和vm关系,vm中v和m的关系?
java·开发语言·javascript
SilentSamsara14 分钟前
缓存策略实战:Redis + Python 多级缓存设计与失效策略
开发语言·redis·python·缓存·性能优化
zlinear数据采集卡18 分钟前
输出短路保护电路深度解析:从电源的“最后一道防线”到ZLinear采集卡的硬核守护实战
开发语言·嵌入式硬件·持续集成
剑锋所指,所向披靡!21 分钟前
C++多线程实现
开发语言·c++·chrome