OHOS(HarmonyOS) 编译 C/C++ 库

1. OHOS(HarmonyOS) 编译 C/C++ 库

  • [1. OHOS(HarmonyOS) 编译 C/C++ 库](#1. OHOS(HarmonyOS) 编译 C/C++ 库)
    • [1.1. HarmonyOS 简介](#1.1. HarmonyOS 简介)
    • [1.2. harmon sdk 环境准备](#1.2. harmon sdk 环境准备)
      • [1.2.1. ets](#1.2.1. ets)
      • [1.2.2. js](#1.2.2. js)
      • [1.2.3. native](#1.2.3. native)
      • [1.2.4. previewer](#1.2.4. previewer)
      • [1.2.5. toolchains](#1.2.5. toolchains)
    • [1.3. linux下编译三方C/C++库](#1.3. linux下编译三方C/C++库)
      • [1.3.1. cmake 编译](#1.3.1. cmake 编译)
      • [1.3.2. configure 编译](#1.3.2. configure 编译)
      • [1.3.3. makefile 编译](#1.3.3. makefile 编译)
    • [1.4. aki](#1.4. aki)
    • [1.5. 参考文档](#1.5. 参考文档)

1.1. HarmonyOS 简介

本文主要介绍如何在 Linux 下使用 HarmonyOS SDK, 为 OHOS(HarmonyOS 简称 OHOS) 编译 C/C++ 库

harmonyOS 使用 ArkTS 语音,ArkTS 是 TS(TypeScript)的超级,TS是 JS(JavaScript) 的超集。简单来说,ArkTS 是 JS 语法的扩展,如果你熟悉 JS,那么学习 ArkTS 会非常容易。

1.2. harmon sdk 环境准备

  1. 下载HarmonyOS SDK, https://ci.openharmony.cn/workbench/closerelease/sdk
    1. 下载 ohos-sdk-full.tar.gz 即可,里边包含 window 和 linux 的库
    2. mac 下载 ohos-sdk-mac-full.tar.gz 包
    3. 我下载的是 3.1.6版本,2023年1月30日发布(此版本编译aki会报错,找不到 unordered_map)
    4. 最新版本可以从 https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes 的镜像站点获取
  • SDK 分为两个版本 full 版本和 public 版本, 这两个版本的 SDK 中关于 c/c++ 编译的部分是相同的,full 版本的 SDK 在 ets 层提供了更多的 API
  • 解压 ohos-sdk-full.tar.gz 后,得到 ohos-sdk 目录,里面包含了 linux 和 windows 的 SDK, 解压linux中的压缩包,结果如下
shell 复制代码
➜  ohos-sdk git:(master) ✗ tree -L 2
.
├── linux
│   ├── ets
│   ├── ets-linux-3.1.12.5-Release.zip
│   ├── js
│   ├── js-linux-3.1.12.5-Release.zip
│   ├── native
│   ├── native-linux-3.1.12.5-Release.zip
│   ├── previewer
│   ├── previewer-linux-3.1.12.5-Release.zip
│   ├── toolchains
│   └── toolchains-linux-3.1.12.5-Release.zip
└── windows
    ├── ets-windows-3.1.12.5-Release.zip
    ├── js-windows-3.1.12.5-Release.zip
    ├── native-windows-3.1.12.5-Release.zip
    ├── previewer-windows-3.1.12.5-Release.zip
    └── toolchains-windows-3.1.12.5-Release.zip

7 directories, 10 files

1.2.1. ets

ets 目录主要与 eTS(HarmonyOS eXtended TypeScript)开发相关,eTS 是 OpenHarmony 推荐的开发语言。

1.2.2. js

js 目录用于支持 JavaScript 开发,尽管 OpenHarmony 更推荐使用 eTS,但仍保留对 JavaScript 的支持。

1.2.3. native

编译 C/C++ 代码需要的文件夹,主要包含 Clang 等编译工具

shell 复制代码
➜  native git:(master) ✗ tree -L 1
.
├── build                               # 目录存放的是 构建时 cmake 依赖的配置文件,比如 cmake/ohos.toolchain.cmake, cmake 编译三方库时使用
├── build-tools                         # 目录存放的是 构建工具包含 cmake 和 ninja,我们后面采用 make 进行构建。
├── docs                                # 目录存放 使用说明
├── llvm                                # 目录存放 clang 编译器, configure/makefile 等编译工具使用
├── nativeapi_syscap_config.json        # 记录 SDK 提供的能力对应的头文件
├── ndk_system_capability.json          # 记录记录 SDK 提供的能力
├── NOTICE.txt                          # 为注意事项,内容多为 SDK 的详细描述
├── oh-uni-package.json                 # 为 SDK 信息描述,如版本
└── sysroot                             # 目录为编译器的 sysroot 目录,存放 SDK 内部的已经包含的库和对应的头文件

5 directories, 4 files

1.2.4. previewer

previewer 指的是预览器,它为开发者提供了在开发环境中快速预览应用界面效果的能力,无需将应用部署到实际设备或模拟器上

1.2.5. toolchains

tools 目录包含了开发、调试和打包 OpenHarmony 应用所需的各种工具。

1.3. linux下编译三方C/C++库

  1. 准备环境,详见上文
  2. 下载要编译的三方库源码
  3. 开始编译(根据源码,有多种编译方式,详见下文)

1.3.1. cmake 编译

参考 https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/lycium/doc/ohos_use_sdk/OHOS_SDK-Usage.md

  • 这是官方推荐的编译方式,也是最常用最简单的方式
  • 和标准的 cmake 编译方式类似,只是需要制定一些额外的参数
    • OHOS_STL libc++的链接方式,由于C++运行时中存在一些全局变量,因此同一应用中的全部Native库需要采用相同的链接方式。
      • c++_shared (默认)
      • c++_static
    • OHOS_ARCH
      • x86_64 (默认)
      • armeabi-v7a
      • arm64-v8a
    • OHOS_PLATFORM=OHOS
    • CMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake

举例如下:

shell 复制代码
OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux 
PATH=${OHOS_SDK}/native/build-tools/cmake/bin:$PATH
which cmake

rm -rf build
mkdir build
cmake -DOHOS_STL=c++_shared -DOHOS_ARCH=armeabi-v7a -DOHOS_PLATFORM=OHOS -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake -B build
cmake --build build

举例

shell 复制代码
git clone https://github.com/DaveGamble/cJSON.git -b v1.7.15
cd cJSON
OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux
${OHOS_SDK}/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake  -B build
cmake --build build

1.3.2. configure 编译

参考 https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/lycium/doc/ohos_use_sdk/OHOS_SDK-Usage.md

shell 复制代码
# aarch64-linux-ohos
export OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录

export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export CC="${OHOS_SDK}/native/llvm/bin/clang --target=aarch64-linux-ohos"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=aarch64-linux-ohos"
export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export CFLAGS="-fPIC -D__MUSL__=1"
export CXXFLAGS="-fPIC -D__MUSL__=1"
export HOST_TAG=aarch64-linux
shell 复制代码
# linux-arm
export OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录

export CC="${OHOS_SDK}/native/llvm/bin/clang --target=arm-linux-ohos"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=arm-linux-ohos"
export CFLAGS="-fPIC -march=armv7a -D__MUSL__=1"
export CXXFLAGS="-fPIC -march=armv7a -D__MUSL__=1"

export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export HOST_TAG=arm-linux
shell 复制代码
# 设置好上边编译参数之后,只要按照标准的 configure 用法即可.
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz
tar xvf ${src_pkg}
cd libsodium-1.0.18
install_dir=/tmp/${HOST_TAG}
./configure --host=${HOST_TAG} --prefix=${install_dir}
make && make install
file ${install_dir}/lib/*
cd -

1.3.3. makefile 编译

具体可参考 configure 编译

1.4. aki

https://gitee.com/openharmony-sig/aki

AKI (Alpha Kernel Interacting) 是一款边界性编程体验友好的ArkTs FFI开发框架,针对OpenHarmony Native开发提供JS与C/C++跨语言访问场景解决方案。支持极简语法糖使用方式,一行代码完成JS与C/C++的无障碍跨语言互调,所键即所得。

可以实现 C/C++ 调用 JS,JS 调用 C/C++

1.5. 参考文档

相关推荐
钟离墨笺3 小时前
【c++】四种类型转换形式
开发语言·c++
汤姆和杰瑞在瑞士吃糯米粑粑4 小时前
【C++学习篇】C++11
开发语言·c++
_extraordinary_4 小时前
C++智能指针的使用
c++·智能指针
zjkzjk77114 小时前
C++ 左值引用 & 右值引用 && std::move()左值改右值 移动构造函数()
开发语言·c++
HL_LOVE_C5 小时前
全面理解-c++11中的智能指针
开发语言·c++
亲爱的老吉先森5 小时前
常见数据结构的C语言定义---《数据结构C语言版》
c语言·开发语言·数据结构
KAI77385 小时前
2月10日QT
c++
塞尔维亚大汉6 小时前
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【中断及异常处理】
操作系统·harmonyos
獨枭7 小时前
在 MFC 应用中集成 WebView2
c++·mfc