CMake跨平台构建:鸿蒙PC适配完全指南
本文介绍了为OpenHarmony平台适配的CMake构建工具ohos-cmake的安装与使用方法。文中提供了完整的打包脚本和安装路径规范(/data/service/hnp/),并对比了鸿蒙PC与开发板/容器在使用方式上的差异。该项目为鸿蒙生态下的C/C++开发提供了标准化的构建工具支持。
ohos-cmake 是为 OpenHarmony 平台编译的 CMake 构建系统。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 CMake 工具,包括 HNP 包的打包、安装和使用方法。
📋 目录
欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/
一、项目概述
1.1 CMake 工具简介
CMake(Cross-platform Make)是一个开源的跨平台构建系统生成器,用于管理软件构建过程。它使用独立于编译器的配置文件来控制软件编译过程。
核心特性:
- 🔧 跨平台构建:支持 Windows、Linux、macOS 等多种平台
- 📝 简单配置:通过
CMakeLists.txt文件描述构建规则 - ⚡ 高效构建:生成原生构建系统(如 Makefile、Ninja)
- 🎯 依赖管理:强大的依赖查找和管理能力
- 🔄 模块化:丰富的模块和工具支持
主要应用场景:
- C/C++ 项目的构建管理
- 跨平台项目构建配置
- 大型项目的依赖管理
- 与 IDE 集成(如 CLion、Qt Creator)
- 自动化构建流程

1.2 项目信息
| 项目信息 | 详情 |
|---|---|
| 项目名称 | ohos-cmake |
| 版本 | 4.1.2(CMake 官方版本) |
| 许可证 | Apache License 2.0 |
| 目标平台 | 鸿蒙PC (aarch64-linux-ohos) |
| 源码仓库 | https://github.com/Kitware/CMake |
| 适配仓库 | https://github.com/Harmonybrew/ohos-cmake |
| 预构建包 | https://github.com/Harmonybrew/ohos-cmake/releases |
| 编译方式 | 交叉编译(Cross Compilation) |
| 依赖项 | OpenSSL 3.0.9 |
1.3 CMake 构建流程
CMake 的典型构建流程包括:
- 配置阶段:读取
CMakeLists.txt,生成构建系统文件 - 生成阶段:创建 Makefile 或 Ninja 文件
- 构建阶段:使用生成的构建系统编译项目
CMakeLists.txt → cmake configure → 构建系统文件 → 编译 → 可执行文件
1.4 为什么需要 ohos-cmake?
在鸿蒙PC上进行开发时,我们经常需要:
- ✅ 构建 C/C++ 项目:管理复杂的 C/C++ 项目构建过程
- ✅ 跨平台开发:使用统一的构建配置支持多平台
- ✅ 依赖管理:自动查找和管理项目依赖
- ✅ 与 IDE 集成:支持现代 IDE 的 CMake 项目
二、为什么需要 HNP 包
2.1 系统安全限制
重要说明: 在鸿蒙PC上,由于系统安全规格限制等原因,暂不支持通过"解压 + 配 PATH"的方式直接使用 tar.gz 包。
这意味着:
- ❌ 不能直接解压 tar.gz 包到任意目录
- ❌ 不能通过设置 PATH 环境变量来使用
- ✅ 必须打包成 HNP(HarmonyOS Native Package)格式才能正常使用
2.2 HNP 包的优势
HNP 包是鸿蒙PC的官方包管理格式,具有以下优势:
- ✅ 系统集成:与鸿蒙PC的包管理系统集成
- ✅ 安全可靠:通过官方工具安装,符合系统安全规范
- ✅ 易于管理:支持安装、卸载、更新等操作
- ✅ 路径规范:统一安装在
/data/service/hnp/目录下
2.3 其他平台的使用方式
在鸿蒙开发板上:
- 可以使用 hdc 推送 tar.gz 包
- 支持"解压 + 配 PATH"的方式
在鸿蒙容器中:
- 可以直接下载 tar.gz 包
- 支持"解压 + 配 PATH"的方式
三、HNP 包打包方法
3.1 准备工作
3.1.1 下载预构建包
首先,从 release 页面 下载官方适配完成的预构建包:
# 下载 cmake 预构建包
wget https://github.com/Harmonybrew/ohos-cmake/releases/download/4.1.2/cmake-4.1.2-ohos-arm64.tar.gz
3.1.2 解压并查看结构
# 解压 tar.gz 包
tar -zxf cmake-4.1.2-ohos-arm64.tar.gz
# 查看目录结构
tree cmake-4.1.2-ohos-arm64/
目录结构示例:
cmake-4.1.2-ohos-arm64/
├── bin/
│ ├── cmake # cmake 可执行文件
│ ├── cpack # cpack 打包工具
│ └── ctest # ctest 测试工具
├── share/
│ └── cmake-4.1/ # CMake 模块和配置文件
├── licenses.txt # 许可证文件(包含 CMake 和 OpenSSL)
└── ...
3.2 创建 HNP 包配置
3.2.1 创建 hnp.json
在解压后的目录中创建 hnp.json 配置文件:
{
"type": "hnp-config",
"name": "cmake",
"version": "4.1.2",
"install": {
"links": [
{
"source": "bin/cmake",
"target": "cmake"
},
{
"source": "bin/cpack",
"target": "cpack"
},
{
"source": "bin/ctest",
"target": "ctest"
}
]
}
}
配置说明:
type: 固定为"hnp-config"name: 包名称(cmake)version: 版本号(4.1.2)install.links: 安装时的符号链接配置cmake: 主要的构建工具cpack: 打包工具ctest: 测试工具
3.2.2 准备安装目录结构
按照 HNP 包的路径规则,准备安装目录:
# HNP 包的路径规则:${HNP_PUBLIC_PATH}/<包名>.org/<包名>_<版本号>
# 例如:/data/service/hnp/cmake.org/cmake_4.1.2
export HNP_PUBLIC_PATH=/data/service/hnp
export CMAKE_INSTALL_PATH=${HNP_PUBLIC_PATH}/cmake.org/cmake_4.1.2
# 创建安装目录
mkdir -p ${CMAKE_INSTALL_PATH}
3.3 打包脚本
3.3.1 方法一:手动打包
创建打包脚本 pack_hnp.sh:
#!/bin/bash
set -e
# 配置变量
CMAKE_VERSION="4.1.2"
TAR_FILE="cmake-${CMAKE_VERSION}-ohos-arm64.tar.gz"
EXTRACT_DIR="cmake-${CMAKE_VERSION}-ohos-arm64"
HNP_PUBLIC_PATH="/data/service/hnp"
CMAKE_INSTALL_PATH="${HNP_PUBLIC_PATH}/cmake.org/cmake_${CMAKE_VERSION}"
OUTPUT_DIR="output"
WORKDIR=$(pwd)
# 创建输出目录
mkdir -p ${OUTPUT_DIR}
# 解压 tar.gz 包
if [ ! -d "${EXTRACT_DIR}" ]; then
echo "解压 ${TAR_FILE}..."
tar -zxf ${TAR_FILE}
fi
# 创建安装目录
echo "创建安装目录..."
mkdir -p ${CMAKE_INSTALL_PATH}
# 复制文件
echo "复制文件..."
cp -r ${EXTRACT_DIR}/* ${CMAKE_INSTALL_PATH}/
# 创建 hnp.json
echo "创建 hnp.json..."
cat > ${CMAKE_INSTALL_PATH}/hnp.json << 'EOF'
{
"type": "hnp-config",
"name": "cmake",
"version": "4.1.2",
"install": {
"links": [
{
"source": "bin/cmake",
"target": "cmake"
},
{
"source": "bin/cpack",
"target": "cpack"
},
{
"source": "bin/ctest",
"target": "ctest"
}
]
}
}
EOF
# 设置执行权限
chmod +x ${CMAKE_INSTALL_PATH}/bin/*
# 使用 hnpcli 打包(如果可用)
if command -v hnpcli &> /dev/null; then
echo "使用 hnpcli 打包..."
hnpcli pack -i ${CMAKE_INSTALL_PATH} -o ${OUTPUT_DIR}/
echo "HNP 包已生成: ${OUTPUT_DIR}/cmake.hnp"
else
echo "警告: 未找到 hnpcli 工具,跳过 HNP 包生成"
echo "请手动使用 hnpcli 打包:"
echo " hnpcli pack -i ${CMAKE_INSTALL_PATH} -o ${OUTPUT_DIR}/"
fi
# 生成 tar.gz 包(备用)
echo "生成 tar.gz 包..."
cd ${HNP_PUBLIC_PATH}/cmake.org
tar -zcf ${WORKDIR}/${OUTPUT_DIR}/ohos_cmake_${CMAKE_VERSION}.tar.gz cmake_${CMAKE_VERSION}/
cd - > /dev/null
echo "打包完成!"
echo "输出文件:"
echo " - ${OUTPUT_DIR}/cmake.hnp (如果 hnpcli 可用)"
echo " - ${OUTPUT_DIR}/ohos_cmake_${CMAKE_VERSION}.tar.gz"
3.4 验证打包结果
打包完成后,验证生成的文件:
# 检查 HNP 包
ls -lh output/cmake.hnp
# 检查 tar.gz 包
ls -lh output/ohos_cmake_4.1.2.tar.gz
# 验证安装目录结构
tree ${CMAKE_INSTALL_PATH}/
预期的安装目录结构:
/data/service/hnp/cmake.org/cmake_4.1.2/
├── bin/
│ ├── cmake
│ ├── cpack
│ └── ctest
├── share/
│ └── cmake-4.1/
├── licenses.txt
└── hnp.json
四、安装与使用
4.1 安装 HNP 包
手动安装(使用 tar.gz)
# 在鸿蒙PC上执行
# 1. 解压 tar.gz 包
tar -xzf ohos_cmake_4.1.2.tar.gz
# 2. 复制到安装目录
sudo cp -r cmake_4.1.2/* /data/service/hnp/cmake.org/cmake_4.1.2/
# 3. 设置执行权限
sudo chmod +x /data/service/hnp/cmake.org/cmake_4.1.2/bin/*
# 4. 创建符号链接(根据 hnp.json 配置)
# hnp 系统会自动处理 links 配置,但也可以手动创建
sudo ln -sf /data/service/hnp/cmake.org/cmake_4.1.2/bin/cmake /usr/local/bin/cmake
sudo ln -sf /data/service/hnp/cmake.org/cmake_4.1.2/bin/cpack /usr/local/bin/cpack
sudo ln -sf /data/service/hnp/cmake.org/cmake_4.1.2/bin/ctest /usr/local/bin/ctest
4.2 验证安装
# 检查 cmake 是否可用
cmake --version
# 应该显示 CMake 的版本信息
# cmake version 4.1.2
4.3 使用 CMake
安装完成后,就可以使用 CMake 来构建项目了:
# 基本使用流程
mkdir build
cd build
cmake ..
make
# 或者使用 Ninja 作为后端
cmake -GNinja ..
ninja
五、使用示例
5.1 基本 CMake 项目
创建一个简单的 CMake 项目:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(HelloWorld)
add_executable(hello main.cpp)
main.cpp:
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
构建步骤:
mkdir build
cd build
cmake ..
make
./hello
5.2 使用外部库
CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(MyProject)
find_package(OpenSSL REQUIRED)
add_executable(myapp main.cpp)
target_link_libraries(myapp OpenSSL::SSL OpenSSL::Crypto)
5.3 配置构建选项
# 指定构建类型
cmake -DCMAKE_BUILD_TYPE=Release ..
# 指定安装路径
cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
# 传递自定义变量
cmake -DMY_VAR=value ..
5.4 使用 Ninja 后端
# 使用 Ninja 作为构建后端(更快)
cmake -GNinja ..
ninja
# 或者
cmake .. -G Ninja
ninja
5.5 交叉编译配置
# 设置交叉编译工具链
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
# 或者直接指定编译器
cmake -DCMAKE_C_COMPILER=aarch64-linux-ohos-clang \
-DCMAKE_CXX_COMPILER=aarch64-linux-ohos-clang++ ..
六、常见问题
6.1 OpenSSL 依赖问题
问题: CMake 需要 OpenSSL,但找不到?
解决方案:
CMake 在构建时已经静态链接了 OpenSSL,运行时不需要额外的 OpenSSL 库。如果遇到问题,检查:
# 检查 CMake 的 OpenSSL 配置
cmake --version
# 查看 CMake 的模块路径
cmake --system-information | grep CMAKE_MODULE_PATH
6.2 CPU Affinity 补丁
问题: 为什么需要禁用 CPU affinity?
回答:
OpenHarmony 不支持 pthread_getaffinity_np 和 pthread_setaffinity_np 接口,因此在构建 CMake 时需要应用补丁来禁用这些功能。预构建包已经应用了这个补丁。
如果从源码构建,需要应用 0001-disable-cpu-affinity.patch 补丁。
6.3 权限问题
问题: 安装后无法执行 cmake 命令?
解决方案:
# 检查文件权限
ls -l /data/service/hnp/cmake.org/cmake_4.1.2/bin/cmake
# 设置执行权限
chmod +x /data/service/hnp/cmake.org/cmake_4.1.2/bin/cmake
# 检查符号链接
ls -l /usr/local/bin/cmake
6.4 构建相关问题
问题: 如何从源码构建 CMake?
回答:
参考项目 README 中的构建说明,需要在 Linux x64 服务器上运行 build.sh 脚本进行交叉编译:
# 在 Ubuntu 24.04 x64 上
sudo apt update && sudo apt install -y build-essential unzip cmake
./build.sh
构建过程会:
- 下载 OpenHarmony SDK
- 设置交叉编译环境
- 编译 OpenSSL(CMake 的依赖)
- 下载并编译 CMake 源码(应用 CPU affinity 补丁)
- 生成预构建包
6.5 CMake 版本问题
问题: 项目要求特定版本的 CMake?
解决方案:
# 检查当前版本
cmake --version
# 如果版本不匹配,需要安装对应版本
# 或者使用 CMake 的版本要求检查
cmake_minimum_required(VERSION 3.10)
七、总结与最佳实践
7.1 使用建议
- 优先使用 HNP 包:在鸿蒙PC上,优先使用 HNP 包安装,符合系统安全规范。
- 选择合适的构建后端:对于大型项目,使用 Ninja 后端可以显著提升构建速度。
- 管理依赖:使用
find_package和FetchContent来管理项目依赖。 - 版本管理:在
CMakeLists.txt中指定cmake_minimum_required,确保构建环境一致。
7.2 性能优化
- 使用 Ninja 后端:Ninja 比 Make 更快,特别是对于大型项目。
- 并行构建:使用
-j选项(Make)或-j选项(Ninja)进行并行构建。 - 增量构建:CMake 支持增量构建,只重新编译修改过的文件。
- 缓存配置:使用
ccache可以加速重复构建。
7.3 最佳实践
- 项目结构:遵循标准的 CMake 项目结构,使用
build目录进行构建。 - 配置分离:将构建配置和源码分离,使用外部构建目录。
- 模块化设计:将大型项目拆分为多个 CMake 子项目。
- 文档化:在
CMakeLists.txt中添加注释,说明配置选项和依赖关系。
更多推荐
所有评论(0)