# 使用CMake与OHOS NDK编译三方库 OHOS NDK支持通过工具链使用CMake编译C/C++代码,工具链文件是用于自定义交叉编译工具链行为的 CMake 文件。OHOS NDK使用的编译工具链在OHOS SDK目录下的位置:`native/build/cmake/ohos.toolchain.cmake`。 使用命令行进行CMake编译时,需要指定工具链文件ohos.toolchain.cmake所在路径。 本文介绍CMake与OHOS NDK搭配如何使用。 ## OpenHarmony NDK获取方式 1. 获取已发布版本,参考:[OpenHarmony Release Notes](https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes#openharmony-release-notes),选择对应版本,在“从镜像站点获取”小节下载对应版本SDK包,NDK包含在SDK包中。 2. 获取每日构建版本,每日构建地址:[OpenHarmony dailybuilds](http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist),在每日构建形态组件中选择"ohos-sdk",下载对应SDK包,NDK包含在SDK包中。 3. 获取源码构建版本,参考:[sourcecode acquire](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md),下载OpenHarmony源码,执行以下命令编译SDK: (1)若首次编译OpenHarmony源码,需要安装依赖:`./build/build_scripts/env_setup.sh`, 完成后执行:`source ~/.bashrc` (2)下载预编译工具链:`./build/prebuilts_download.sh` (3)编译SDK:`./build.sh --product-name ohos-sdk` (4)生成SDK所在路径:`out/sdk/packages` ## OpenHarmony NDK说明 SDK包中native所在目录即是NDK,目录如下: ``` native ├── build │ └── cmake │ ├── ohos.toolchain.cmake # 编译的工具链 │ └── sdk_native_platforms.cmake ├── build-tools # cmake编译工具所在目录 ├── docs ├── llvm # llvm编译器工具链 ├── nativeapi_syscap_config.json # NDK提供的SystemCapability的相关头文件 ├── ndk_system_capability.json # NDK提供的SystemCapability的描述文件 ├── oh-uni-package.json # 版本信息 ├── NOTICE.txt └── sysroot ``` * build目录 build目录下的ohos.toolchain.cmake是工具链文件,使用CMake编译时,需要指定工具链文件ohos.toolchain.cmake所在路径。cmake编译时需要读取该文件中的默认值,比如编译器的选择、编译平台。 * build-tools build-tools目录下是NDK自带的cmake编译工具,配置编译环境时需要添加cmake路径 * llvm llvm目录是OHOS NDK提供的编译器工具 ## 环境配置 ### linux 将OHOS NDK自带的build-tools目录下cmake工具添加到环境变量 ``` # 打开.bashrc文件 vim ~/.bashrc # 在文件最后添加cmake路径,该路径是自己的放置文件的路径,之后保存退出 export PATH=${OHOS SDK路径}/ohos-sdk/linux/native/build-tools/cmake/bin:$PATH # 在命令行执行source ~/.bashrc使环境变量生效 source ~/.bashrc ``` 使用`which cmake`和`cmake --version`验证是否生效。 ### windows 右键点击我的电脑,在下拉框中选择我的电脑,点击高级系统设置,点击环境变量,点击Path后点编辑,点击新建,将路径添加进去。 使用`cmake --version`验证是否生效。 ## CMake编译 使用CMake编译时,需要指定工具链文件,同时还需要指定OHOS平台的参数 常用参数如下: | 参数 | 类型 | 备注 | | ------------------------ | ------------------------- | ------------------- | | OHOS_STL | c++_shared/c++_static | 默认是c++_shared | | OHOS_ARCH | armeabi-v7a | 设置ABI | | OHOS_PLATFORM | OHOS | 平台选择 | | CMAKE_TOOLCHAIN_FILE | 工具链文件 | - | ### linux #### 创建demo工程 工程目录 ``` ├── CMakeLists.txt └── src ├── CMakeLists.txt └── hello.cpp ``` 外部 CMakeLists.txt内容: ``` #cmake的版本 CMAKE_MINIMUM_REQUIRED(VERSION 3.16) #工程名称 PROJECT(HELLO) #添加一个子目录并构建该子目录。 ADD_SUBDIRECTORY(src bin) ``` src目录下源码文件hello.cpp内容: ```cpp #include int main(int argc,const char **argv) { std::cout<< "hello world!" < int main(int argc,const char **argv) { std::cout<< "hello world!" <