HarmonyOS:使用命令行CMake构建NDK工程

一、前言

在很多复杂应用工程中,C++代码工程是通过CMake等构建系统以命令行方式来编译构建的,接下来介绍如何把已有的CMake工程切换到HarmonyOS工具链中,从而使用命令行CMake构建该工程。

二、下载NDK开发包

NDK开发相关工具位于$DevEco Studio安装目录/sdk/default/openharmony/native路径下。

2.1 mac系统native目录

native目录文件

native/build-tools/cmake/bin目录文件

native/build/cmake目录文件

2.2 windows系统native目录

native目录文件

\native\build-tools\cmake\bin目录文件

native\build\cmake目录文件

三、配置环境变量

提醒:如果只是在DevEco Studio中使用,跳过以下步骤

3.1 将NDK自带的CMake编译工具添加到环境变量中

  • 配置 linux 系统下环境变量
bash 复制代码
# 打开.bashrc文件
vim ~/.bashrc
# 在文件最后添加cmake路径,该路径是自己的放置文件的路径,之后保存退出
export PATH=${实际SDK路径}/native/build-tools/cmake/bin:$PATH
# 在命令行执行source ~/.bashrc使环境变量生效
source ~/.bashrc
  • 配置 mac 系统下环境变量
bash 复制代码
#在当前用户目录下,打开 .bash_profile 文件,文件如果不存在,创建即可
vim ~/.bash_profile
#在文件最后添加 cmake 路径,该路径是自己的放置文件的路径,之后保存退出
export PATH=$PATH:${实际SDK路径}/native/build-tools/cmake/bin
#在命令行执行 source ~/.bash_profile 使环境变量生效
source ~/.bash_profile
  • 配置 windows 下的环境变量

右键点击我的电脑,在下拉框中选择我的电脑,点击高级系统设置,点击环境变量,点击Path后点编辑,点击新建,将路径添加进去,之后保存退出,打开cmd(若下一步不能够实现,请重启电脑尝试)。

打开命令框,输入{cmake实际安装路径}\cmake.exe -version,命令行正确回显cmake的版本号,说明环境变量配置完成。

查看CMake默认路径

  • linux 和 mac 系统环境下
c 复制代码
#在命令行输入which命令查询当前CMake所在路径
which cmake
#结果路径与.bashrc中设置一致
~/ohos-sdk/ohos-sdk/linux/native/build-tools/cmake/bin/cmake

四、使用NDK开发包编译Native程序

应用开发者可以通过NDK开发包快速的开发出Native动态库、静态库与可执行文件。NDK开发包提供CMake编译构建工具脚本,下面通过编写一个C/C++ demo工程来演示适配过程。

4.1 demo工程内容

下面是一个CMake的demo工程内容,此工程包含两个目录,include目录包含此库的头文件,src目录包含全部源码;src目录包含两个文件,sum.cpp的算法文件,以及main.cpp的调用算法的主入口文件,目标是编译成一个可执行程序,以及一个算法动态库。

demo目录图

objectivec 复制代码
demo
  ├── CMakeLists.txt
  ├── include
       └── sum.h
  └── src
       ├── CMakeLists.txt
       ├── sum.cpp
       └── hello.cpp

根目录CMakeLists.txt内容

scss 复制代码
# 指定CMake的最小版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.1.6)


# 工程名称,这里我们就叫HELLO
PROJECT(HELLO)


#添加一个子目录并构建该子目录。
ADD_SUBDIRECTORY(src)

内部CMakeLists.txt内容

bash 复制代码
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动态库目标,编译成功会生成一个libsum.so
ADD_LIBRARY(sum SHARED sum.cpp)


# 生成可执行程序,添加一个Hello的可执行程序目标,编译成功会生成一个Hello可执行程序
ADD_EXECUTABLE(Hello ${LIBHELLO_SRC})


# 指定Hello目标include目录路径
TARGET_INCLUDE_DIRECTORIES(Hello PUBLIC ../include)


# 指定Hello目标需要链接的库名字
TARGET_LINK_LIBRARIES(Hello PUBLIC sum)

源码内容

sum.h源码

arduino 复制代码
int sum(int a, int b);

sum.cpp源码

arduino 复制代码
#include <iostream>
    
int sum(int a, int b)
{
    return a + b;
}

hello.cpp源码

c 复制代码
#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;
}

五、编译构建demo工程

5.1 linux 和 mac 系统环境下

在工程目录下,创建build目录,用来放置CMake构建时产生的中间文件。注意: ohos-sdk是下载下来的SDK的根目录,开发者需要自行替换成实际的下载目录。

  • 采用OHOS_STL=c++_shared动态链接c++库方式构建工程,如不指定,默认采用c++_shared;DOHOS_ARCH参数可根据系统架构来决定具体值,例如当DOHOS_ARCH=armeabi-v7a会编译32位动态库,而当DOHOS_ARCH=arm64-v8a会编译64位动态库。
c 复制代码
 >mkdir build && cd build
 >cmake -DOHOS_STL=c++_shared -DOHOS_ARCH=armeabi-v7a -DOHOS_PLATFORM=OHOS -DCMAKE_TOOLCHAIN_FILE={ohos-sdk}/linux/native/build/cmake/ohos.toolchain.cmake ..
 >cmake --build .


执行完cmake --build .命令后,查看demo/build/src目录文件

  • 采用OHOS_STL=c++_static静态链接c++库方式构建工程,当DOHOS_ARCH=armeabi-v7a会编译32位静态库,而当DOHOS_ARCH=arm64-v8a会编译64位静态库。
c 复制代码
 >mkdir build && cd build
 >cmake -DOHOS_STL=c++_static -DOHOS_ARCH=armeabi-v7a -DOHOS_PLATFORM=OHOS -DCMAKE_TOOLCHAIN_FILE={ohos-sdk}/linux/native/build/cmake/ohos.toolchain.cmake ..
 >cmake --build .

命令中,OHOS_ARCH与OHOS_PLATFORM两个变量最终会生成clang++的--target命令参数,在此例子中就是--target=arm-linux-ohos --march=armv7a两个参数。

CMAKE_TOOLCHAIN_FILE指定了toolchain文件,在此文件中默认给clang++设置了--sysroot={ndk_sysroot目录},告诉编译器查找系统头文件的根目录。

5.2 windows系统环境下

在windows下使用cmake进行编译,与linux下不同的是,使用cmake要加入参数 -G 选择使用的生成器,直接回车会列出下面的生成器

这里使用的是cmake .. -G "Ninja" 引号里面跟的参数就是上图查看的环境所支持的生成器,这里ndk中自带的生成器是Ninja。

同样在工程目录下创建 build 文件夹并执行以下指令:

ini 复制代码
cmake.exe -G "Ninja" -D OHOS_STL=c++_shared -D OHOS_ARCH=armeabi-v7a -D OHOS_PLATFORM=OHOS -D CMAKE_TOOLCHAIN_FILE=D:\native\build\cmake\ohos.toolchain.cmake ..

注意:如需debug调试,增加参数 -D CMAKE_BUILD_TYPE=normal;cmake路径和编译工具链ohos.toolchain.cmake路径都是下载好的ndk路径。
执行结果如下图:

这里生成的build.ninja文件就是我们需要的 。

ninja -f build.ninja 或者用 cmake --build . 执行结果如下:


相关推荐
KKei163821 分钟前
Flutter for OpenHarmony 编程技能树APP技术文章
flutter·华为·harmonyos
想你依然心痛26 分钟前
HarmonyOS 6(API 23)实战:基于Face AR呼吸监测与Body AR姿态引导的“静界空间“——PC端沉浸式冥想疗愈系统
华为·ar·harmonyos·悬浮导航·沉浸光感
KKei163834 分钟前
Flutter for OpenHarmony 个人财务管理与记账APP
flutter·华为·harmonyos
nashane1 小时前
HarmonyOS 6学习:Web组件与JavaScript交互的三大高频问题与终极解决方案
前端·学习·harmonyos
Swift社区1 小时前
鸿蒙 PC 构建体系详解:从 DevEco 到发布
华为·harmonyos
KKei16381 小时前
Flutter for OpenHarmony 本地音乐播放器APP
flutter·华为·harmonyos
largecode1 小时前
怎么让手机显示公司名?来电显示公司名称认证实现品牌外显
linux·ubuntu·华为od·华为·智能手机·华为云·harmonyos
KKei16382 小时前
Flutter for OpenHarmony 外语单词背诵与听力训练APP
flutter·华为·harmonyos
前端不太难2 小时前
AI Native 鸿蒙 App 的四层架构
人工智能·架构·harmonyos
云和数据.ChenGuang2 小时前
HarmonyOS 手机模拟器开发「随身猜谜语小游戏」的技术实现方案
华为·智能手机·harmonyos