with one click
harmonyos-cpp-cmake
// HarmonyOS C++ 工程 CMake 配置:build-profile.json5 native 构建参数、CMakeLists.txt 与 hvigor 协作、多 ABI(arm64-v8a/x86_64)构建、第三方 .so 预置与链接、SANITIZER 编译选项
// HarmonyOS C++ 工程 CMake 配置:build-profile.json5 native 构建参数、CMakeLists.txt 与 hvigor 协作、多 ABI(arm64-v8a/x86_64)构建、第三方 .so 预置与链接、SANITIZER 编译选项
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | harmonyos-cpp-cmake |
| description | HarmonyOS C++ 工程 CMake 配置:build-profile.json5 native 构建参数、CMakeLists.txt 与 hvigor 协作、多 ABI(arm64-v8a/x86_64)构建、第三方 .so 预置与链接、SANITIZER 编译选项 |
| tech_stack | ["harmonyos"] |
| language | ["cpp","cmake"] |
| capability | ["ci-cd"] |
| version | HarmonyOS unversioned |
| collected_at | "2025-01-15T00:00:00.000Z" |
Source: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-cmake-adapts-to-harmonyos, https://developer.huawei.com/consumer/en/doc/harmonyos-guides-V14/ide-hvigor-build-profile-V14, https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-api
HarmonyOS 的 C++ Native 模块通过 CMake 组织构建,由 hvigor 驱动调用。本技能覆盖从 build-profile.json5 声明 native 构建参数、编写 CMakeLists.txt、配置多 ABI 构建、链接第三方预编译 .so,到启用 SANITIZER 排查内存问题的完整链路,以及从 Android NDK 迁移时的注意事项。
.so(如音视频编解码库、加密库)在模块的 build-profile.json5 中通过 buildOption.nativeLib 字段声明:
// entry/build-profile.json5
{
"apiType": "stageMode",
"buildOption": {
"nativeLib": {
"path": "./src/main/cpp/CMakeLists.txt", // CMakeLists.txt 路径(必填)
"abiFilters": ["arm64-v8a", "x86_64"], // 目标 ABI(真机 + 模拟器)
"buildOption": {
"sanitizer": "address" // 可选:asan / undefined
},
"arguments": "-DCMAKE_BUILD_TYPE=Release" // 可选:传递给 CMake 的 -D 变量
}
}
}
关键字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
path | ✅ | CMakeLists.txt 的相对路径(相对于模块根目录) |
abiFilters | ✅ | arm64-v8a(真机)和/或 x86_64(模拟器) |
buildOption.sanitizer | ❌ | "address"(ASan)或 "undefined"(UBSan),仅 Debug |
arguments | ❌ | 传递给 CMake 的额外 -D 变量,空格分隔 |
externalNativeOptions | ❌ | 更细粒度的 CMake/ninja 参数覆盖 |
# 最低 CMake 版本
cmake_minimum_required(VERSION 3.16.0)
# 项目名(通常与模块名一致)
project(my_native_lib)
# 声明 native 库 target
add_library(my_native_lib SHARED
src/main.cpp
src/utils.cpp
)
# 引用 HarmonyOS SDK 提供的系统库
find_library(
hilog-lib # 变量名
hilog_ndk.z # 实际的库名(不需要 lib 前缀和 .so 后缀)
)
find_library(
ace-napi-lib
ace_napi.z
)
# 链接系统库
target_link_libraries(my_native_lib PUBLIC
${hilog-lib}
${ace-napi-lib}
)
# 头文件搜索路径
target_include_directories(my_native_lib PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
)
关键 HarmonyOS NDK 系统库名称(用于 find_library):
| 库文件名 | 用途 |
|---|---|
ace_napi.z | NAPI 接口(JS ↔ C++ 桥接) |
hilog_ndk.z | 日志输出 |
libc++.so | C++ 标准库(自动链接) |
libace.z | ArkUI 引擎相关 |
librawfile.z | 资源文件读取 |
native_window.z | 原生窗口/EGL |
entry/src/main/cpp/
├── CMakeLists.txt
├── src/
└── libs/ # 预编译 .so 存放目录
├── arm64-v8a/
│ └── libffmpeg.so # 真机版本
└── x86_64/
└── libffmpeg.so # 模拟器版本
在 CMakeLists.txt 中声明导入库:
# 声明导入的预编译库
add_library(ffmpeg SHARED IMPORTED)
# 指定各 ABI 对应的 .so 路径
set_target_properties(ffmpeg PROPERTIES
IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libs/${CMAKE_OHOS_ARCH_ABI}/libffmpeg.so
)
# 链接到主 target
target_link_libraries(my_native_lib PUBLIC ffmpeg)
HarmonyOS 工具链中的 ABI 变量(替代 Android 的 CMAKE_ANDROID_ARCH_ABI):
# CMAKE_OHOS_ARCH_ABI 在 HarmonyOS 工具链中自动设置为 arm64-v8a 或 x86_64
message(STATUS "Building for ABI: ${CMAKE_OHOS_ARCH_ABI}")
ASan 用于检测内存错误(越界、use-after-free、double-free),UBSan 检测未定义行为(整数溢出、空指针解引用)。
// Debug 构建中启用 ASan
"buildOption": {
"nativeLib": {
"path": "./src/main/cpp/CMakeLists.txt",
"abiFilters": ["arm64-v8a"],
"buildOption": {
"sanitizer": "address" // 或 "undefined"
}
}
}
运行时 ASan 会在检测到错误时立即 crash 并输出详细报告:
==12345==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x... thread T0
#0 ... in my_function() src/main.cpp:42
⚠️ SANITIZER 有 2-5x 性能开销,且会增加 .so 体积,仅限 Debug 构建,切勿在 Release 中启用。
| Android NDK | HarmonyOS NDK | 迁移要点 |
|---|---|---|
CMAKE_ANDROID_ARCH_ABI | CMAKE_OHOS_ARCH_ABI | 全局替换 |
CMAKE_SYSTEM_NAME "Android" | CMAKE_SYSTEM_NAME "OHOS" | 检查 CMake 脚本中的系统判断 |
find_library(log ...) | find_library(hilog-lib hilog_ndk.z) | 日志库名称不同 |
target_link_options ... "-Wl,--gc-sections" | 相同 | 链接选项基本兼容 |
ANDROID_STL 变量 | 不需要 | C++ 标准库自动链接 |
JNI 函数(Java_xxx) | NAPI 函数(napi_xxx) | 接口层需重写 |
| 配置/指令 | 位置 | 作用 |
|---|---|---|
buildOption.nativeLib.path | build-profile.json5 | 指向 CMakeLists.txt |
buildOption.nativeLib.abiFilters | build-profile.json5 | 目标 ABI 列表 |
buildOption.nativeLib.buildOption.sanitizer | build-profile.json5 | 启用 ASan/UBSan |
add_library(xxx SHARED IMPORTED) | CMakeLists.txt | 声明预编译 .so |
set_target_properties(... IMPORTED_LOCATION) | CMakeLists.txt | 指定 .so 文件路径 |
find_library(var libname) | CMakeLists.txt | 查找系统 NDK 库 |
target_link_libraries | CMakeLists.txt | 链接依赖 |
arm64-v8a,模拟器只认 x86_64,abiFilters 写错导致构建通过但运行崩溃CMAKE_SYSTEM_NAME 在 HarmonyOS 工具链中是 "OHOS" 而非 "Android",迁移时所有平台判断代码需检查${CMAKE_CURRENT_SOURCE_DIR} 而非相对路径libffmpeg.so.7,链接时必须保持一致,否则 dlopen 失败build-profile.json5 中 nativeLib 的层级是 buildOption.nativeLib,拼写错误不会告警,直接跳过 native 构建harmonyos-hvigor-buildfind_library(ace-napi-lib ace_napi.z),NAPI 接口使用参考 harmonyos-napi-bindingharmonyos-napi-debug(addr2line 符号化流程)harmonyos-ohpm-clibuild-profile.json5 中还有 ArkTS 侧构建配置(如 buildOption.arkOptions),属于 hvigor 通用配置范畴