[鸿蒙PC三方库移植适配] 使用 AtomCode + Skills 自动完成spdlog鸿蒙化适配
本文介绍了如何使用 AtomCode Skills 工具链高效地将 spdlog C++ 日志库适配到 OpenHarmony 平台。spdlog 是一个高性能的 C++17 日志库,通过自动化工具链可大幅简化移植流程。文章详细展示了从生成 HPKBUILD 骨架、环境检查、问题审查到最终构建验证的全过程,重点突出了 AtomCode Skills 在自动生成构建脚本、检测环境依赖和审查潜在问题方
欢迎加入【开源鸿蒙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 |

目录
- 背景与挑战
- AtomCode Skills 工作流总览
- Step 1:一键生成 HPKBUILD 骨架
- Step 2:构建环境检查
- Step 3:移植审查与问题发现
- Step 4:逐一修复与构建验证
- Step 5:最终构建与产物验证
- 经验总结与最佳实践
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 和潜在问题 |
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_view、std::optional 等),但 CMakeLists.txt 可能依赖编译器默认标准。
修复:在 cmake 参数中添加:
-DSPDLOG_CXX_STANDARD=17
发现 2:spdlog 使用了 std::filesystem
新版本 spdlog 在文件日志(file_sink)中使用 std::filesystem 进行路径操作。如果应用运行在 OHOS 沙箱中,可能会有兼容性问题。
建议:应用集成时确认是否需要文件日志功能。如果只需控制台日志,使用 stdout_sink 或 basic_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 鸿蒙化适配最佳实践
-
零依赖库优先:首次适配选择零依赖的库(如 spdlog、zlib),快速体验完整流程
-
C++17 是标配:OHOS Clang 15.0.4 支持 C++17,新版本三方库普遍使用 C++17 特性,建议所有 CMake 项目显式设置
CMAKE_CXX_STANDARD 17 -
fmt 内嵌策略:spdlog 的 fmt 内嵌策略减少了外部依赖,是 C/C++ 库的优秀实践——在交叉编译环境中,减少依赖就是减少适配工作
-
归档目录名确认:GitHub 归档的顶层目录格式为
<name>-<version>(版本号不带v前缀),需确保builddir匹配 -
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 # 中文说明文档 ✅
更多推荐




所有评论(0)