当前位置: 首页 > news >正文

鸿蒙 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 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"指定生成器。

http://www.jsqmd.com/news/1068042/

相关文章:

  • Windows系统文件FM20.DLL丢失找不到问题解决
  • 为什么你越讨好别人,越没人把你当回事?
  • 腾讯犀牛鸟开源计划启动!一行命令部署 OpenTenBase,速通 issue 拿面试绿通
  • 监督学习与无监督学习是什么?关键区别在有没有答案
  • 【HarmonyOS 6】仿AI唤起屏幕边缘流光特效
  • 基于 Harmony 6.0 应用的车辆保养提醒管家实现
  • Shell脚本为何成为AI智能体视觉(TVA)的“反射弧”(7)
  • 衍射-全息混合架构:实现被动光学实时图像分类的光子AI系统
  • 卫星联邦学习CroSatFL:跨聚合机制如何破解星上智能节能难题
  • 智能合约库验证:上下文合约与模块化架构的测试策略对比
  • 软件质量控制中的统计过程控制
  • LLM运行机制
  • 学习创建支持演示公式的复杂表格|《经济学人》杂志巨无霸指数的可视化图表代码
  • 化学结构识别:为何OCSR视觉技术优于纯文本JSON解析?
  • π0.7项目解析:跨机器人零样本迁移与高效推理的具身智能新范式
  • 专利代理师:2025年专利代理师资格考试《实务》模拟真题及答案
  • 大语言模型推理优化:从思维链到潜在状态轨迹的范式跃迁
  • AI+仿真构建交互式电力工程教学框架:从原理到实践
  • 多集群管理
  • 51单片机音乐盒
  • 基于Fxlms算法用于宽带和窄带主动噪声控制(ANC)研究(Matlab代码实现)
  • 稀疏与突发数据下的漏洞活动预测:SARIMAX与计数模型对比实战
  • 线性合约与标准合约选择及支付机制优化实战指南
  • 接口幂等性设计与实现
  • 视觉语言模型在扫描路径语义相似性分析中的应用
  • 基于神经元激活图的目标导向预训练数据选择:原理、实现与实战
  • MATRIX框架:基于双通道约束奇偶校验的多层代码水印技术实践
  • IA-CLAHE:让传统图像增强算法自适应学习最优参数
  • 奇智创达知识产权管理系统:把「请款→缴费→到款核销→预收款→退款」做成真正的业财一体化闭环
  • PLAF:实现开放词汇3D场景理解的像素级语言对齐特征提取