OpenHarmony(鸿蒙南向开发)——轻量和小型系统三方库移植指南(一)

news/2024/12/22 1:24:42/

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • 持续更新中……

概述

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

CMake方式组织编译的库移植

源码获取

从仓库 获取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_160">将该库编译添加到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)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

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

鸿蒙开发面试真题(含参考答案):

在这里插入图片描述

OpenHarmony_300">OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述


http://www.ppmy.cn/news/1535764.html

相关文章

基于YOLOv8-deepsort算法的智能车辆目标检测车辆跟踪和车辆计数

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

系统架构设计师教程 第15章 15.3 SOA的参考架构 笔记

15.3 SOA的参考架构 企业集成的架构可划 分为6大类。 (1)业务逻辑服务 (Business Logic Service): 包括用于实现业务逻辑的服务和执行业务 逻辑的能力&#xff0c;其中包括业务应用服务 (Business Application Service)、 业务伙伴服务 (Partner Service) 以及应用和信息资产…

【c语言——指针详解(3)】

文章目录 一、字符指针变量二、数组指针变量1、 数组指针变量是什么&#xff1f;2、 数组指针变量怎么初始化 三、⼆维数组传参的本质四、函数指针变量1、函数指针变量的创建2、函数指针变量的使⽤3、两段有趣的代码1&#xff09;typedef 关键字2&#xff09;typedef和define的…

面试题3-JDBC操作数据库的步骤

使用 JDBC&#xff08;Java Database Connectivity&#xff09;操作数据库的基本步骤可以总结为以下几个关键步骤。JDBC 是 Java 语言中与数据库交互的 API&#xff0c;允许开发人员通过标准的接口操作数据库。 1.加载数据库驱动程序 在使用 JDBC 操作数据库之前&#xff0c;首…

【Unity踩坑】Unity导出的UWP项目编译失败

在Unity中导出了UWP平台的项目后&#xff08;Xaml或D3D&#xff09;&#xff0c;使用Visual Studio编译时发生错误&#xff1a; Error: Unity.IL2CPP.Building.BuilderFailedException: Lump_libil2cpp_vm.cpp 查找后发现是Visual Studio 与Unity兼容的问题 原贴&#xff1a;…

如何在微信小程序中实现分包加载和预下载

如何在微信小程序中实现分包加载和预下载 概述 微信小程序提供了分包加载和预下载功能&#xff0c;这有助于优化应用的加载时间&#xff0c;提升用户体验。本文将详细介绍如何在微信小程序中配置分包加载和预下载。 步骤一&#xff1a;配置分包加载 修改app.json文件&#x…

Qt Linguist手册

概述 Qt 为将 Qt C 和 Qt Quick 应用程序翻译成当地语言提供了出色的支持。发布经理、翻译和开发人员可以使用 Qt 工具来完成他们的任务。 发布经理对应用程序的发布负总责。通常&#xff0c;他们负责协调开发人员和翻译人员的工作。他们可以使用 lupdate 工具同步源代码和翻…

Vue-快速入门

什么是Vue Vue.js是一个用于构建用户界面的渐进式JavaScript框架。与其他重型框架不同&#xff0c;Vue的设计理念强调自底向上的增量开发&#xff0c;核心库专注于视图层&#xff0c;易于逐步引入到现有项目中。Vue允许开发者使用声明式的模板语法&#xff0c;有效地管理…