OpenHarmony开发——CMake方式组织编译的库移植

概述

本文为OpenHarmony开发者提供一些组织编译形式比较常见(CMakeLists、Makefile)的三方库的移植指南,该指南当前仅适用于Hi3516DV300和Hi3518EV300两个平台,文中着重介绍各编译组织方式下工具链的设置方法以及如何将该库的编译添加到OpenHarmony整个工程的构建中。

CMake方式组织编译的库移植

以double-conversion库为例,其移植过程如下文所示。

源码获取

从仓库获取double-conversion源码,其目录结构如下表:

表1 源码目录结构

名称描述
double-conversion/cmake/CMake组织编译使用到的模板
double-conversion/double-conversion/源文件目录
double-conversion/msvc/-
double-conversion/test/测试用例源文件
double-conversion/.gitignore-
double-conversion/AUTHORS-
double-conversion/BUILD-
double-conversion/CMakeLists.txtCMake方式顶层编译组织文件
double-conversion/COPYING-
double-conversion/Changelog-
double-conversion/LICENSE-
double-conversion/Makefile-
double-conversion/README.md-
double-conversion/SConstruct-
double-conversion/WORKSPACE-

移植思路

移植思路:通过修改工具链,交叉编译该三方库,生成OpenHarmony平台的可执行文件,最后再通过GN调用CMake的方式添加到OpenHarmony工程中。

交叉编译

编译参考

代码仓库的README.md中详细介绍了使用CMake编译double-conversion库的步骤,以及测试方法。本文参考该指导设置该库的编译配置,并完成测试。若开发人员在移植过程中对该库的编译选项配置有疑惑的地方,可参考该指导。对于其他使用CMake可独立编译的三方库,在移植时可以参考其自带的编译指导。

设置执行交叉编译

CMake方式可通过指定工具链进行交叉编译,修改并编译该库,生成OpenHarmony平台的可执行文件,步骤如下:

  1. 设置工具链
    将下列clang工具链配置添加到该工程的顶层CMakeLists.txt(即表1中的该文件)中即可。
   set(CMAKE_CROSSCOMPILING TRUE)set(CMAKE_SYSTEM_NAME Generic)set(CMAKE_CXX_COMPILER_ID Clang)set(CMAKE_TOOLCHAIN_PREFIX llvm-)#指定c编译工具(确保工具链所在路径已经添加到了PATH环境变量中)和编译标志,使用clang编译时标志中必须指定--target,否则无法交叉编译。set(CMAKE_C_COMPILER clang)set(CMAKE_C_FLAGS "--target=arm-liteos -D__clang__ -march=armv7-a -w -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4")#指定c++编译工具(确保工具链所在路径已经添加到了PATH环境变量中)和编译标志,必须指定--target,否则无法交叉编译。set(CMAKE_CXX_COMPILER clang++) set(CMAKE_CXX_FLAGS "--target=arm-liteos -D__clang__ -march=armv7-a -w -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4")#指定链接工具和链接标志,必须指定--target和--sysroot,其中OHOS_ROOT_PATH可通过cmake命令后缀参数来指定。set(MY_LINK_FLAGS "--target=arm-liteos --sysroot=${OHOS_SYSROOT_PATH}")set(CMAKE_LINKER clang)set(CMAKE_CXX_LINKER clang++)set(CMAKE_C_LINKER clang)set(CMAKE_C_LINK_EXECUTABLE"${CMAKE_C_LINKER} ${MY_LINK_FLAGS} <FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")set(CMAKE_CXX_LINK_EXECUTABLE"${CMAKE_CXX_LINKER} ${MY_LINK_FLAGS} <FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")#指定链接库的查找路径。set(CMAKE_SYSROOT ${OHOS_SYSROOT_PATH})
  1. 执行编译
    linux命令行中进入double-conversion的源文件目录(即标1所示目录),执行下列命令:
   mkdir build && cd buildcmake .. -DBUILD_TESTING=ON -DOHOS_SYSROOT_PATH="..."make -j

其中OHOS_SYSROOT_PATH需用绝对路径指定出sysroot目录的位置,以OpenHarmony为例即目录out/hispark_xxx/ipcamera_hispark_xxx/sysroot的绝对路径。上述目录会在全量编译后生成,因此移植前先完成一次全量编译。

  1. 查看结果
    步骤2操作完成后,build目录下会生成静态库文件和测试用例:

    表2 编译生成文件目录结构

    名称描述
    double-conversion/build/libdouble-conversion.a生成的静态库文件
    double-conversion/build/test/目录下存放生成的测试用例和相关CMake缓存文件
    double-conversion/build/CMakeCache.txtCMake构建过程中的缓存文件
    double-conversion/build/CMakeFiles/-
    double-conversion/build/cmake_install.cmake-
    double-conversion/build/CTestTestfile.cmake-
    double-conversion/build/DartConfiguration.tcl-
    double-conversion/build/generated/-
    double-conversion/build/Makefile-
    double-conversion/build/Testing/-

测试

  1. 搭建OpenHarmony环境
    以Hi3516DV300为例,编译出OpenHarmony镜像,烧写到开发板,相关操作可参考快速入门小型系统部分。

    进入系统如下所示:

图1 OpenHarmony启动成功界面

  1. 挂载nfs目录,将表2中test目录下cctest可执行文件放入nfs目录

  2. 执行用例
    该库采用非交叉编译时用例是通过make test执行,CMake会有相关的执行结果统计;交叉编译时无法使用该方法,因此可直接执行生成的测试文件完成测试。

  • 挂载成功后执行下列命令可列出用例所有条目:
     cd nfs./cctest --list
 上述命令执行结果部分展示:
     test-bignum/Assign<test-bignum/ShiftLeft<test-bignum/AddUInt64<test-bignum/AddBignum<test-bignum/SubtractBignum<test-bignum/MultiplyUInt32<test-bignum/MultiplyUInt64<test-bignum/MultiplyPowerOfTen<test-bignum/DivideModuloIntBignum<test-bignum/Compare<test-bignum/PlusCompare<test-bignum/Square<test-bignum/AssignPowerUInt16<test-bignum-dtoa/BignumDtoaVariousDoubles<test-bignum-dtoa/BignumDtoaShortestVariousFloats<test-bignum-dtoa/BignumDtoaGayShortest<test-bignum-dtoa/BignumDtoaGayShortestSingle<test-bignum-dtoa/BignumDtoaGayFixed<test-bignum-dtoa/BignumDtoaGayPrecision<test-conversions/DoubleToShortest<test-conversions/DoubleToShortestSingle<...
  • 以test-bignum条目为例,执行下列命令开始测试:
     ./cctest test-bignum
 测试结果如下则表示通过:
     Ran 13 tests.

将该库编译添加到OpenHarmony工程中

  1. 复制库到OpenHarmony工程中
    拷贝已经能够成功交叉编译的库到OpenHarmony的third_party目录,为了不修改要移植的三方库目录下的BUILD.gn文件,再添加一层目录放置新增的gn转CMake编译适配文件,新增的文件有BUILD.gn、build_thirdparty.py、 config.gni,新增后的目录结构如下所示。

表3 添加到工程后的目录结构

名称描述
OpenHarmony/third_party/double-conversion/BUILD.gn将三方库加入工程的gn适配文件
OpenHarmony/third_party/double-conversion/build_thirdparty.pyGN调用shell命令脚本文件,由上面GN文件将相关命令传入,实现GN转CMake
OpenHarmony/third_party/double-conversion/config.gni三方库编译配置文件,可修改该文件来配置用例是否参与构建等
OpenHarmony/third_party/double-conversion/double-conversion/要移植的三方库目录
  1. 添加gn到CMake适配文件
    • 新增的BUILD.gn文件实现如下,其他采用CMake方式可独立编译的三方库移植到OpenHarmony平台时只需修改路径即可
     import("config.gni")group("double-conversion") {if (ohos_build_thirdparty_migrated_from_fuchisa == true) {deps = [":make"]}}if (ohos_build_thirdparty_migrated_from_fuchisa == true) {action("make") {script = "//third_party/double-conversion/build_thirdparty.py"outputs = ["$root_out_dir/log_dc.txt"]exec_path = rebase_path(rebase_path("./build", ohos_third_party_dir))command = "rm * .* -rf && $CMAKE_TOOLS_PATH/cmake .. $CMAKE_FLAG $CMAKE_TOOLCHAIN_FLAG && make -j"args = ["--path=$exec_path","--command=${command}"]}}
  • 新增的config.gni用于配置该库,实现如下,其他采用CMake方式可独立编译的三方库移植到OpenHarmony时只需修改CMAKE_FLAG的配置即可。
     #CMAKE_FLAG: config compile featureCMAKE_FLAG = "-DBUILD_TESTING=ON -DCMAKE_CXX_STANDARD=11"#toolchain:follow up-layer,depend on $ohos_build_compilerif (ohos_build_compiler == "clang") {CMAKE_TOOLCHAIN_FLAG = "-DOHOS_SYSROOT_PATH=${root_out_dir}sysroot"} else {CMAKE_TOOLCHAIN_FLAG = ""}#CMake tools path,no need setting if this path already joined to $PATH.CMAKE_TOOLS_PATH = "setting CMake tools path..."
  • 新增的build_thirdparty.py实现如下,其他采用CMake方式可独立编译的三方库移植到OpenHarmony时无需修改即可使用。
     import osimport sysfrom subprocess import Popenimport argparseimport shlexdef cmd_exec(command):cmd = shlex.split(command)proc = Popen(cmd)proc.wait()ret_code = proc.returncodeif ret_code != 0:raise Exception("{} failed, return code is {}".format(cmd, ret_code))def main():parser = argparse.ArgumentParser()parser.add_argument('--path', help='Build path.')parser.add_argument('--command', help='Build command.')parser.add_argument('--enable', help='enable python.', nargs='*')args = parser.parse_args()if args.enable:if args.enable[0] == 'false':returnif args.path:curr_dir = os.getcwd()os.chdir(args.path)if args.command:if '&&' in args.command:command = args.command.split('&&')for data in command:cmd_exec(data)else:cmd_exec(args.command)os.chdir(curr_dir)if __name__ == '__main__':sys.exit(main())
  • 在配置文件中添加开关控制该库编译,默认设为关闭

在//build/lite/ohos_var.gni文件中添加下列配置:

     declare_args() {ohos_build_thirdparty_migrated_from_fuchisa = true}
  1. 编译构建
    手动单独构建:

    执行下列命令

   hb build -T //third_party/double-conversion:double-conversion

编译成功则build目录下会生成静态库文件和测试用例

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.
鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.ppmy.cn/server/2797.html

相关文章

一篇文章厘清C#中的lambda表达式

一篇文章厘清C#中的lambda表达式 链接: 源码 说C#的匿名函数,就要先说一下匿名函数. Lambda表达式 1 lambda表达式演变史1. **C# 1.0 (2002)**2. **C# 2.0 (2005)**3. **C# 3.0 (2007)**4. **C# 4.0及以后** 2 lambda表达式使用方法1 **基本语法**2 **使用场景和示例****作为…

计算机网络——应用层(3)电子邮件

电子邮件 1、概述&#xff1a; 电子邮件是使用电子设备交换的邮件及其方法。 优点&#xff1a;使用方便&#xff0c;传递迅速&#xff0c;费用低廉&#xff0c;可传送多种信息 重要标准&#xff1a; 简单邮件发送协议&#xff1a;SMTP互联网文本报文格式通用互联网邮件扩充…

【python实战】-- 按指定字符生成密码字典并测试打开word

系列文章目录 文章目录 系列文章目录前言一、生成密码字典1.python程序 二、测试打开Word1.python程序 总结 前言 一、生成密码字典 1.python程序 代码如下&#xff08;示例&#xff09;&#xff1a; import string# 定义密码字符集&#xff0c;这里以小写字母为例 #all_char…

pytorch环境配置踩坑记录

一、问题1 1.执行命令 conda create -n pytorch python3.62.报错如下 Solving environment: failedCondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/msys2/noarch/repodata.json.bz2> Elapsed: -An HTTP error occurred when tr…

可视化ETL解决方案:Apache NiFi、DataX(加上DataX-Web)、Kettle这3个解决方案对比

1.Apache NiFi&#xff1a; Apache NiFi是一个易于使用、功能强大的可视化ETL工具&#xff0c;它提供了一套直观的图形界面&#xff0c;让用户可以轻松地设计、管理和监控数据流。NiFi支持多种数据源和目标系统&#xff0c;具有强大的数据处理能力&#xff0c;如数据过滤、转换…

Idea与Maven版本不一致问题

Idea拉取Jar包&#xff0c;报Unable to import maven project: See logs for details 查看日志信息No implementation for org.apache.maven.model.path.PathTranslator was bound 具体错误详情&#xff1a; IDEA执行Maven报错 Unable to import maven project: See logs f…

使用Docker搭建一主二从的redis集群

文章目录 一、根据基础镜像构建三个docker容器二、构建master机三、配置slave机四、测试 本文使用 主机指代 物理机、 master机指代“一主二从”中的 一主&#xff0c; slave机指代“一主二从”中的 二从 一、根据基础镜像构建三个docker容器 根据本文第一章&#xff08…

MIMO(多天线)通信的四种译码算法

目录 一. 介绍 二. 极大似然译码 三. 破零译码算法 四. 最小均方误差算法 五. 球形译码 一. 介绍 发射天线数记为Mt&#xff0c;接收天线数记为Mr。由此发射信号x为向量&#xff1a; 接受信号y为向量&#xff1a; 信道H为矩阵&#xff1a; 利用n代表噪声向量&#xff0c;…

【Web】2022DASCTF Apr X FATE 防疫挑战赛 题解(全)

目录 warmup-php soeasy_php warmup-java warmup-php spl_autoload_register函数实现了当程序遇到调用没有定义过的函数时&#xff0c;会去找./class/函数名.php路径下的php文件&#xff0c;并把它包含在程序中。 拿到附件拖进Seay里自动审计一下 显然利用终点为evaluateExp…

探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率

探索 IntelliJ IDEA 2024.1最新变化&#xff1a;全面升级助力编码效率 文章目录 探索 IntelliJ IDEA 2024.1最新变化&#xff1a;全面升级助力编码效率摘要引言 IntelliJ IDEA 2024.1 最新变化关键亮点全行代码补全 Ultimate对 Java 22 功能的支持新终端 Beta编辑器中的粘性行 …

用html写文本变形动画

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文本变形动画</title><link rel"stylesheet" href"./style.css"> </head> <body> <!-- 两个文本部分…

oracle 19c数据库W00n进程使用很多PGA内存资源的分析

今天&#xff0c;客户反馈测试环境的数据库PGA资源不足&#xff0c;报错ORA-04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT&#xff1b;分析是多个W00n进程使用大量PGA-触发了BUG&#xff0c;对应解决办法就是打补丁。&#xff08;民间办法就是KILL进程、重启数据库&…

微服务架构中的业务解耦设计

目录 业务解耦的原则 单一责任原则 松耦合原则 业务解耦的实现方法 业务解耦的优势 微服务架构中的业务解耦设计案例 背景 业务解耦设计 服务拆分 商品服务 订单服务 用户服务 支付服务 物流服务 通信机制 数据一致性 具体实现 商品服务 订单服务 用户服务…

锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测 Matlab基于GRU的锂电池剩余寿命预测 基于GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2020及以上 锂电池的剩余寿命预测是…

SVN修改已提交版本的注释

目录 一、需求分析 二、问题分析 三、解决办法 一、需求分析 ​开发过程中&#xff0c;在SVN提交文件后&#xff0c;发现注释写的不完整或不够明确&#xff0c;想再修改之前的注释文字​。 使用环境&#xff1a; SVN服务器操作系统&#xff1a;Ubuntu 20.04.6 LTS SVN版本&…

MongoDB的go SDK使用集锦

在上一章解读MongoDB官方文档获取mongo7.0版本的安装步骤与基本使用介绍了如何使用mongo shell操作mongo数据库&#xff0c;接下来介绍如何使用sdk来操作数据库&#xff0c;这里以go语言为例&#xff0c;其他语言请查看源文档mongo docs Quick Start 内置数据结构 MongoDB是存…

Java 变得越来越像 Rust?

随着编程技术的增强和复杂性的提升&#xff0c;许多编程语言也纷纷效仿&#xff0c;Java 也不例外。 另一边&#xff0c;尽管社区内部问题重重&#xff0c;但 Rust 仍逐年获得开发人员的喜爱。这背后都是有原因的&#xff1a;Rust 的编译器让开发人员避免了各种问题。编译器对…

【MIT6.824】lab2C-persistence, lab2D-log compaction 实现笔记

引言 lab2C的实验要求如下 Complete the functions persist() and readPersist() in raft.go by adding code to save and restore persistent state. You will need to encode (or “serialize”) the state as an array of bytes in order to pass it to the Persister. Us…

设计模式系列:适配器模式

简介 适配器模式&#xff08;Adapter Pattern&#xff09;又称为变压器模式&#xff0c;它是一种结构型设计模式。适配器模式的目的是将一个类的接口转换成客户端所期望的另一种接口&#xff0c;从而使原本因接口不匹配而不能一起工作的两个类能够一起工作。 适配器模式有两种…

论软件系统的架构风格,使用三段论 写一篇系统架构师论文

软件系统的架构风格是指在软件系统设计与开发过程中&#xff0c;采用的一组相互协调的设计原则、模式和实践。这些风格不仅影响着系统的技术实现&#xff0c;还关乎到系统的可维护性、可扩展性和可靠性等关键质量属性。通过三段论的结构&#xff0c;本文旨在探讨软件系统架构风…