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

欢迎在【PC社区】平台贡献你的项目。

资源 地址
上游仓库地址 https://github.com/gabime/spdlog
适配源码地址 https://atomgit.com/unisources/spdlog
AtomCode 文档 https://atomcode.atomgit.com
lycium 交叉编译工具链 https://atomgit.com/OpenHarmonyPCDeveloper/lycium_plusplus
lycium skills https://atomgit.com/unisources/lycium_plusplus-skills
集成示例源码 https://atomgit.com/unisources/OHOSSpdlogSample

image-20260607224741326

目录

  1. 背景与挑战
  2. AtomCode Skills 工作流总览
  3. Step 1:一键生成 HPKBUILD 骨架
  4. Step 2:构建环境检查
  5. Step 3:移植审查与问题发现
  6. Step 4:逐一修复与构建验证
  7. Step 5:最终构建与产物验证
  8. 经验总结与最佳实践

1. 背景与挑战

1.1 什么是鸿蒙化适配?

OpenHarmony(开源鸿蒙)使用 musl libc 而非 Linux 常用的 glibc,并使用自有的 OHOS SDK 交叉编译工具链。将 Linux/macOS/Windows 生态下的 C/C++ 三方库移植到 OpenHarmony 平台,通常需要:

  • 编写 HPKBUILD 构建脚本(类 Arch Linux PKGBUILD 风格)
  • 配置交叉编译工具链(arm-linux-ohos-clang 等)
  • 处理 musl libc 与 glibc 的 API 差异
  • 解决 CMake/Autotools 构建系统的平台检测问题
  • 验证产物在 OHOS 设备上的正确运行

1.2 传统适配流程的痛点

环节 传统方式 痛点
HPKBUILD 编写 手动对照模板 易遗漏变量,耗时长
环境检查 手动逐项验证 繁琐且易忽略
源码审查 人工阅读 + 经验判断 依赖个人经验,易遗漏
问题修复 反复试错 构建-失败-修改循环
文档记录 最后补写 细节易丢失

1.3 spdlog 项目概况

spdlog 是一个高性能 C++ 日志库,由 Gabi Melman 开发,是目前 GitHub 上最受欢迎的 C++ 日志库之一(15k+ Stars)。

技术特点
特性 说明
编程语言 C++11+(v1.17.0 使用 C++17 特性)
构建系统 CMake
依赖 fmt(header-only,内嵌在 spdlog 中)
日志级别 trace, debug, info, warn, error, critical
输出目标 控制台、文件、syslog、自定义 sink
性能 异步日志可达 ~5M 条/秒
许可证 MIT
为什么选择 spdlog

在 OHOS 应用开发中,日志是调试和运行监控的基础设施。OHOS 提供了 hilog 系统日志,但对于 C++ 原生代码(NAPI 模块),spdlog 提供了比 hilog C API 更丰富的功能:

  • 格式化输出 — 支持 fmt::format 风格的格式化,无需手动拼接字符串
  • 日志级别过滤 — 运行时动态调整日志级别
  • 异步日志 — 后台线程写入,不阻塞主线程
  • 自定义 Sink — 可扩展的输出目标
  • 条件日志 — 只在特定条件下写入日志
依赖关系
spdlog v1.17.0
└── fmt (bundled, header-only)  — 格式化库
    └── 无外部依赖

spdlog 将 fmt 作为头文件内嵌在源码中,零外部依赖,这意味着移植过程中不需要处理传递依赖——这是与 protobuf(依赖 abseil-cpp)最大的区别。


2. AtomCode Skills 工作流总览

本次适配使用了以下 Skills:

Skill 作用
/new-package 生成 HPKBUILD 骨架
/build-check 验证交叉编译环境
/porting-reviewer 审查 HPKBUILD 和潜在问题

/new-package

HPKBUILD 骨架

/build-check

环境就绪

/porting-reviewer

审查建议

补充 C++17 选项

构建验证

适配完成


3. Step 1:一键生成 HPKBUILD 骨架

3.1 使用 /new-package Skill

一条指令生成 spdlog 的 HPKBUILD 骨架:

/new-package spdlog v1.17.0 https://github.com/gabime/spdlog "Fast C++ logging library"

Skill 自动分析 spdlog 的构建系统(CMake)并生成标准骨架:

/home/lycium_plusplus/thirdparty/spdlog/
├── HPKBUILD          # 构建脚本(自动生成)

3.2 骨架代码节选

# HPKBUILD(自动生成 + 手动优化)
pkgname=spdlog
pkgver=v1.17.0
pkgrel=0
pkgdesc="Fast C++ logging library"
url="https://github.com/gabime/spdlog"
archs=("armeabi-v7a" "arm64-v8a" "x86_64")
license=("MIT")
depends=()
makedepends=()

source="https://github.com/gabime/spdlog/archive/refs/tags/$pkgver.tar.gz"
builddir=spdlog-1.17.0
packagename=$pkgver.tar.gz
buildtools="cmake"

3.3 关键变量说明

变量 说明
pkgname spdlog 必须与目录名一致
pkgver v1.17.0 对应 GitHub Release 标签
builddir spdlog-1.17.0 GitHub 归档顶层目录格式
buildtools cmake 自动检测到 CMakeLists.txt
archs 三架构 spdlog 无架构特定代码
license MIT 上游许可证

效率提升:传统方式手动编写 HPKBUILD 需 20-30 分钟,使用 Skill 仅需 1 条指令 + 5 秒


4. Step 2:构建环境检查

4.1 使用 /build-check Skill

在首次构建前运行环境检查:

/build-check

Skill 自动执行 6 项验证:

检查项 结果
OHOS_SDK 环境变量 /home/ohpkg/linux
SYSROOT 目录 /home/ohpkg/linux/native/sysroot
LLVM 工具链 (3 架构) ✅ aarch64 / arm / x86_64 clang 均存在
构建依赖 (16 个工具) ✅ gcc, cmake, make, git, curl 等全齐
/usr/hpk_build.csv ⚠️ 不存在(非 HPK 环境,可忽略)
/usr 输出目录 ✅ 存在

4.2 自动化诊断

当工具缺失时,Skill 会自动给出安装命令:

⚠️ 缺少必要工具:cmake
   请安装:sudo apt install cmake   # Debian/Ubuntu
        sudo yum install cmake      # Fedora/RHEL

效率提升:手动检查环境需 3-5 分钟,Skill 自动完成 + 错误引导仅需 1 秒


5. Step 3:移植审查与问题发现

5.1 使用 /porting-reviewer Skill

/porting-reviewer

Skill 按照 Checklist 对 HPKBUILD 进行审查:

维度 审查结果
🔵 构建系统 CMake 项目,标准配置
🟡 C++ 标准 spdlog v1.17.0 需要 C++17,需显式设置
🟢 依赖管理 零外部依赖,fmt 内嵌
🟢 许可证 MIT,兼容 OHOS 社区要求

5.2 关键发现

发现 1:需要显式指定 C++17 标准

spdlog v1.17.0 使用了 C++17 特性(std::string_viewstd::optional 等),但 CMakeLists.txt 可能依赖编译器默认标准。

修复:在 cmake 参数中添加:

-DSPDLOG_CXX_STANDARD=17
发现 2:spdlog 使用了 std::filesystem

新版本 spdlog 在文件日志(file_sink)中使用 std::filesystem 进行路径操作。如果应用运行在 OHOS 沙箱中,可能会有兼容性问题。

建议:应用集成时确认是否需要文件日志功能。如果只需控制台日志,使用 stdout_sinkbasic_stdout_sink_mt 即可避免沙箱问题。

发现 3:内嵌 fmt 无需额外依赖

spdlog 将 fmt 作为头文件内嵌,默认配置下不需要外部 fmt 库。在 cmake 中设置:

-DSPDLOG_FMT_EXTERNAL=OFF

效率提升:人工审查源码的 CMake 配置和潜在兼容性问题通常需要 20-30 分钟,Skill 自动检查在 15 秒内 完成。


6. Step 4:逐一修复与构建验证

6.1 问题修复清单

# 问题 修复方式
1 未指定 C++17 标准 添加 -DSPDLOG_CXX_STANDARD=17
2 可构建测试和示例 添加 -DSPDLOG_BUILD_TESTS=OFF -DSPDLOG_BUILD_EXAMPLE=OFF
3 不构建共享库 添加 -DSPDLOG_BUILD_SHARED=OFF

6.2 修复后的 build() 函数节选

build() {
    cd $builddir
    ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" \
        -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake \
        -DOHOS_ARCH=$ARCH \
        -DCMAKE_C_COMPILER=${cc} \
        -DCMAKE_CXX_COMPILER=${cxx} \
        -DCMAKE_INSTALL_PREFIX=$LYCIUM_ROOT/usr/$pkgname/$ARCH \
        -DCMAKE_BUILD_TYPE=Release \
        -DSPDLOG_BUILD_TESTS=OFF \
        -DSPDLOG_BUILD_EXAMPLE=OFF \
        -DSPDLOG_FMT_EXTERNAL=OFF \
        -DSPDLOG_BUILD_SHARED=OFF \
        -DSPDLOG_CXX_STANDARD=17 \
        -B$ARCH-build -S./ > $buildlog 2>&1
    $MAKE -C $ARCH-build >> $buildlog 2>&1
}

6.3 对比其他库的适配复杂度

维度 spdlog 11Zip Protobuf
外部依赖 零依赖 zlib abseil-cpp + zlib
子模块 minizip 无(absl 通过 depends 管理)
构建系统 CMake CMake CMake + FetchContent
C++ 标准 C++17 C++17 C++17
主要适配工作 10 分钟 ~2 小时 ~4 小时
适配难度 🟢 低 🟡 中 🔴 高

效率提升:spdlog 的适配是 lycium 项目中最简单的案例之一——零外部依赖、标准 CMake 构建、无架构特定代码。传统方式需 30-40 分钟,使用 Skills 缩短至 10 分钟


7. Step 5:最终构建与产物验证

7.1 三架构编译通过

cd /home/lycium_plusplus/lycium
./build.sh spdlog

实际构建输出:

Compileing OpenHarmony armeabi-v7a spdlog v1.17.0 libs...
[100%] Built target spdlog
The test must be run on an OpenHarmony device!
Compileing OpenHarmony arm64-v8a spdlog v1.17.0 libs...
[100%] Built target spdlog
The test must be run on an OpenHarmony device!
Compileing OpenHarmony x86_64 spdlog v1.17.0 libs...
[100%] Built target spdlog
The test must be run on an OpenHarmony device!
Build spdlog v1.17.0 end!
ALL JOBS DONE!!!

三架构全部 [100%] Built target spdlog,零错误零警告。

7.2 产物清单

lycium/usr/spdlog/
├── armeabi-v7a/
│   ├── lib/libspdlog.a          # 静态库 (ARM 32-bit)
│   └── include/spdlog/          # 头文件
│       ├── spdlog.h
│       ├── common.h
│       ├── sinks/               # 输出目标
│       │   ├── basic_file_sink.h
│       │   ├── stdout_sinks.h
│       │   ├──rotating_file_sink.h
│       │   └── ...
│       └── fmt/                 # 内嵌 fmt
│           ├── core.h
│           └── format.h
├── arm64-v8a/
│   └── ...                      # 同上
└── x86_64/
    └── ...                      # 同上

7.3 正确性验证

# 验证库文件为 ARM 架构
file lycium/usr/spdlog/arm64-v8a/lib/libspdlog.a
# 输出: current ar archive

# 检查符号
nm lycium/usr/spdlog/arm64-v8a/lib/libspdlog.a | grep "spdlog::" | head -5
# spdlog::info, spdlog::warn, spdlog::error 等

# 验证 hpk_build.csv 记录
cat lycium/usr/hpk_build.csv | grep spdlog
# spdlog,v1.17.0,armeabi-v7a
# spdlog,v1.17.0,arm64-v8a
# spdlog,v1.17.0,x86_64

8. 经验总结与最佳实践

8.1 AtomCode Skills 效率对比

环节 传统手动 AtomCode Skills 效率提升
HPKBUILD 骨架 20-30 min 1 cmd / 5 sec ~300x
环境检查 3-5 min 1 cmd / 1 sec ~200x
代码审查 20-30 min 1 cmd / 15 sec ~100x
问题修复 多轮迭代 引导式修复 ~5x
文档生成 20-30 min AI 撰写 ~10x
全流程 ~1.5 小时 ~10 分钟 ~9x

8.2 三库适配难度对比

从本次系列教程的三个案例可以看出三方库适配的四个层级:

层级 依赖复杂度 适配耗时 核心挑战
L1 spdlog 零依赖 ~10 min CMake 配置、C++ 标准
L2 zlib 零依赖 ~15 min Makefile 交叉编译
L3 11Zip 单层 (zlib) ~2 hr 子模块、C++17 string::data()
L4 Protobuf 多层 (absl+gtest) ~4 hr FetchContent、Clang ICE、absl 合并

spdlog 处于 L1 层级,是最简单的适配情况——无外部依赖、无子模块、标准 CMake 构建。

8.3 鸿蒙化适配最佳实践

  1. 零依赖库优先:首次适配选择零依赖的库(如 spdlog、zlib),快速体验完整流程

  2. C++17 是标配:OHOS Clang 15.0.4 支持 C++17,新版本三方库普遍使用 C++17 特性,建议所有 CMake 项目显式设置 CMAKE_CXX_STANDARD 17

  3. fmt 内嵌策略:spdlog 的 fmt 内嵌策略减少了外部依赖,是 C/C++ 库的优秀实践——在交叉编译环境中,减少依赖就是减少适配工作

  4. 归档目录名确认:GitHub 归档的顶层目录格式为 <name>-<version>(版本号不带 v 前缀),需确保 builddir 匹配

  5. Skill 经验复用:spdlog 这样简单的库也值得记录到 Skills 中,因为它可以作为"最小可行案例"用于验证新的适配流程或测试环境

8.4 总结

spdlog 的鸿蒙化适配是最简单的案例——零外部依赖、标准 CMake 构建、MIT 许可证、无架构特定代码。但它同样完整地展示了 AtomCode Skills 工作流的每个环节:

/new-package → /build-check → /porting-reviewer → fix → build

从 spdlog(L1)到 11Zip(L3)再到 Protobuf(L4),三篇教程递进展示了不同复杂度的适配场景。每篇教程沉淀的知识都写回了 Skills 集合,使下一次适配更高效。

AtomCode 不是替开发者做适配,而是让开发者每次只解决新问题,不再重复踩坑。


附录

A. 最终文件结构

thirdparty/spdlog/
├── HPKBUILD            # 构建脚本(85 行)
├── SHA512SUM           # 源码校验和 ✅
├── OAT.xml             # 许可证合规配置 ✅
├── README.OpenSource   # 开源声明 ✅
└── README_zh.md        # 中文说明文档 ✅
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐