鸿蒙 NDK开发:使用命令行CMake构建工程(三)
2026/6/23 15:53:16 网站建设 项目流程

当C++代码工程需要独立于DevEco Studio进行编译时,可以使用命令行方式将现有CMake工程切换到HarmonyOS工具链。

一、获取NDK开发包

方式一:通过Command Line Tools获取

下载command line tools并解压,NDK开发相关工具位于:

$command_line_tools解压目录/sdk/default/openharmony/native

方式二:通过DevEco Studio获取

下载并安装DevEco Studio,NDK开发相关工具位于:

$DevEco Studio安装目录/sdk/default/openharmony/native

二、配置环境变量

说明:如果只是在DevEco Studio中使用,跳过此步骤。

Linux系统

# 打开.bashrc文件 vim ~/.bashrc # 在文件最后添加cmake路径 export PATH=${实际SDK路径}/native/build-tools/cmake/bin:$PATH # 使环境变量生效 source ~/.bashrc

Mac系统

# 打开.bash_profile文件 vim ~/.bash_profile # 在文件最后添加cmake路径 export PATH=${实际SDK路径}/native/build-tools/cmake/bin:$PATH # 使环境变量生效 source ~/.bash_profile

Windows系统

右键点击“我的电脑” → “属性” → “高级系统设置” → “环境变量”,找到“Path”并点击“编辑”,添加NDK中cmake的bin目录路径。

验证环境变量配置

cmake.exe -version # 正确回显cmake版本号则说明配置完成

三、CMake命令参数

参数说明可选值
OHOS_STLC++运行时库链接方式c++_shared(默认)/ c++_static
OHOS_ARCH目标编译架构armeabi-v7a / arm64-v8a / x86_64
OHOS_PLATFORM平台标识OHOS
CMAKE_TOOLCHAIN_FILEtoolchain文件路径ndk路径下的ohos.toolchain.cmake

参数作用

  • OHOS_ARCH+OHOS_PLATFORM→ 生成--target=arm-linux-ohos等clang++命令参数

  • CMAKE_TOOLCHAIN_FILE→ 默认给clang++设置--sysroot,指定系统头文件根目录

四、示例

4.1 工程目录结构

demo ├── CMakeLists.txt # 根目录CMake配置 ├── include │ └── sum.h # 头文件 └── src ├── CMakeLists.txt # 子目录CMake配置 ├── sum.cpp # 算法实现 └── hello.cpp # 主入口

4.2 源码内容

根目录CMakeLists.txt

# 指定CMake的最小版本 CMAKE_MINIMUM_REQUIRED(VERSION 3.16) # 工程名称 PROJECT(HELLO) # 添加一个子目录并构建该子目录 ADD_SUBDIRECTORY(src)

src目录CMakeLists.txt

SET(LIBHELLO_SRC hello.cpp) # 设置编译参数 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") # 设置链接参数 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--emit-relocs --verbose") # 添加动态库目标(libsum.so) ADD_LIBRARY(sum SHARED sum.cpp) # 生成可执行程序(Hello) ADD_EXECUTABLE(Hello ${LIBHELLO_SRC}) # 指定头文件目录 TARGET_INCLUDE_DIRECTORIES(Hello PUBLIC ../include) # 指定链接库 TARGET_LINK_LIBRARIES(Hello PUBLIC sum)

hello.cpp

#include <iostream> #include "sum.h" int main(int argc, const char **argv) { std::cout << "hello world!" << std::endl; int total = sum(1, 100); std::cout << "Sum 1 + 100=" << total << std::endl; return 0; }

sum.h

int sum(int a, int b);

sum.cpp

#include <iostream> int sum(int a, int b) { return a + b; }

4.3 Linux/Mac编译构建

# 创建build目录 mkdir build && cd build # 动态链接方式(默认c++_shared) cmake -D OHOS_STL=c++_shared \ -D OHOS_ARCH=arm64-v8a \ -D OHOS_PLATFORM=OHOS \ -D CMAKE_TOOLCHAIN_FILE={ohos-sdk}/linux/native/build/cmake/ohos.toolchain.cmake \ .. # 执行构建 cmake --build .

静态链接方式

cmake -D OHOS_STL=c++_static \ -D OHOS_ARCH=arm64-v8a \ -D OHOS_PLATFORM=OHOS \ -D CMAKE_TOOLCHAIN_FILE={ohos-sdk}/linux/native/build/cmake/ohos.toolchain.cmake \ ..

注意:需要将{ohos-sdk}替换为实际的SDK下载目录。

4.4 Windows编译构建

# 进入build目录 cd build # 使用Ninja生成器 cmake -G "Ninja" \ -D OHOS_STL=c++_shared \ -D OHOS_ARCH=arm64-v8a \ -D OHOS_PLATFORM=OHOS \ -D CMAKE_TOOLCHAIN_FILE=F:\\windows\\native\\build\\cmake\\ohos.toolchain.cmake \ .. # 执行Ninja编译 ninja -f build.ninja # 或使用cmake命令 cmake --build .

Debug调试:如需debug调试,增加参数-D CMAKE_BUILD_TYPE=Debug

五、动态链接 vs 静态链接

对比项动态链接(c++_shared)静态链接(c++_static)
运行时加载运行时加载库文件库代码直接嵌入可执行文件
库文件形式.a(静态库).so(共享库)
磁盘空间节省更大
库更新需要重新编译无需重新编译
启动性能有加载开销更快
适用场景对磁盘空间敏感的应用对启动性能敏感或运行环境受限的场景

命令行CMake构建NDK工程需通过CMAKE_TOOLCHAIN_FILE指定ohos.toolchain.cmake,并通过OHOS_ARCH(arm64-v8a/armeabi-v7a/x86_64)、OHOS_STL(c++_shared/c++_static)、OHOS_PLATFORM=OHOS参数配置编译环境,Windows下需使用-G "Ninja"指定生成器。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询