鸿蒙 NDK开发:使用命令行CMake构建工程(三)

发布时间:2026/6/23 15:53:45
鸿蒙 NDK开发:使用命令行CMake构建工程(三) 当C代码工程需要独立于DevEco Studio进行编译时可以使用命令行方式将现有CMake工程切换到HarmonyOS工具链。一、获取NDK开发包方式一通过Command Line Tools获取下载command line tools并解压NDK开发相关工具位于$command_line_tools解压目录/sdk/default/openharmony/native方式二通过DevEco Studio获取下载并安装DevEco StudioNDK开发相关工具位于$DevEco Studio安装目录/sdk/default/openharmony/native二、配置环境变量说明如果只是在DevEco Studio中使用跳过此步骤。Linux系统# 打开.bashrc文件 vim ~/.bashrc # 在文件最后添加cmake路径 export PATH${实际SDK路径}/native/build-tools/cmake/bin:$PATH # 使环境变量生效 source ~/.bashrcMac系统# 打开.bash_profile文件 vim ~/.bash_profile # 在文件最后添加cmake路径 export PATH${实际SDK路径}/native/build-tools/cmake/bin:$PATH # 使环境变量生效 source ~/.bash_profileWindows系统右键点击“我的电脑” → “属性” → “高级系统设置” → “环境变量”找到“Path”并点击“编辑”添加NDK中cmake的bin目录路径。验证环境变量配置cmake.exe -version # 正确回显cmake版本号则说明配置完成三、CMake命令参数参数说明可选值OHOS_STLC运行时库链接方式c_shared默认/ c_staticOHOS_ARCH目标编译架构armeabi-v7a / arm64-v8a / x86_64OHOS_PLATFORM平台标识OHOSCMAKE_TOOLCHAIN_FILEtoolchain文件路径ndk路径下的ohos.toolchain.cmake参数作用OHOS_ARCHOHOS_PLATFORM→ 生成--targetarm-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.txtSET(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.hint 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_STLc_shared \ -D OHOS_ARCHarm64-v8a \ -D OHOS_PLATFORMOHOS \ -D CMAKE_TOOLCHAIN_FILE{ohos-sdk}/linux/native/build/cmake/ohos.toolchain.cmake \ .. # 执行构建 cmake --build .静态链接方式cmake -D OHOS_STLc_static \ -D OHOS_ARCHarm64-v8a \ -D OHOS_PLATFORMOHOS \ -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_STLc_shared \ -D OHOS_ARCHarm64-v8a \ -D OHOS_PLATFORMOHOS \ -D CMAKE_TOOLCHAIN_FILEF:\\windows\\native\\build\\cmake\\ohos.toolchain.cmake \ .. # 执行Ninja编译 ninja -f build.ninja # 或使用cmake命令 cmake --build .Debug调试如需debug调试增加参数-D CMAKE_BUILD_TYPEDebug。五、动态链接 vs 静态链接对比项动态链接c_shared静态链接c_static运行时加载运行时加载库文件库代码直接嵌入可执行文件库文件形式.a静态库.so共享库磁盘空间节省更大库更新需要重新编译无需重新编译启动性能有加载开销更快适用场景对磁盘空间敏感的应用对启动性能敏感或运行环境受限的场景命令行CMake构建NDK工程需通过CMAKE_TOOLCHAIN_FILE指定ohos.toolchain.cmake并通过OHOS_ARCHarm64-v8a/armeabi-v7a/x86_64、OHOS_STLc_shared/c_static、OHOS_PLATFORMOHOS参数配置编译环境Windows下需使用-G Ninja指定生成器。