当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 ~/.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_STL | C++运行时库链接方式 | c++_shared(默认)/ c++_static |
OHOS_ARCH | 目标编译架构 | armeabi-v7a / arm64-v8a / x86_64 |
OHOS_PLATFORM | 平台标识 | OHOS |
CMAKE_TOOLCHAIN_FILE | toolchain文件路径 | 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"指定生成器。