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

news2025/1/16 16:15:17

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

源码获取

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

表1 源码目录结构

名称描述
yxml/bench/benchmark相关代码
yxml/test/测试输入输出文件,及测试脚本
yxml/Makefile编译组织文件
yxml/.gitattributes-
yxml/.gitignore-
yxml/COPYING-
yxml/yxml.c-
yxml/yxml.c.in-
yxml/yxml-gen.pl-
yxml/yxml.h-
yxml/yxml.md-
yxml/yxml-states-

设置交叉编译

设置Makefile的交叉编译工具链,修改并编译该库,生成OpenHarmony平台的可执行文件,步骤如下:

  1. 设置工具链
    将下列clang工具链配置替换掉yxml库根目录的Makefile(即表1中的文件)中的原有配置。

    clang工具链配置:

   #设置交叉编译工具链,确保工具链所在路径已经添加到了PATH环境变量中
   CC:=clang
   AR:=llvm-ar
   #cflags中必须要添加--target及--sysroot选项
   CFLAGS:=-Wall -Wextra -Wno-unused-parameter -O2 -g --target=arm-liteos -march=armv7-a -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 --sysroot=$(OHOS_SYSROOT_PATH)

原有配置:

   CC:=gcc
   AR:=ar
   CFLAGS:=-Wall -Wextra -Wno-unused-parameter -O2 -g
  1. 执行编译
    linux命令行中进入yxml的源文件目录(即图1所示目录),执行下列命令:
   make test OHOS_SYSROOT_PATH=...

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

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

表2 yxml编译生成目录

名称描述
OpenHarmony/third_party/yxml/yxml/out/lib/编译生成的静态库的存放目录
OpenHarmony/third_party/yxml/yxml/out/test/编译生成的测试用例及其输入输出等文件的存放目录

测试

yxml库测试步骤与double-conversion库基本一致,可参考CMake方式组织编译的库移植的测试过程,以下内容介绍yxml库测试用例的使用方法:

表3 生成的test目录结构示意

名称描述
OpenHarmony/third_party/yxml/yxml/out/test/test.sh自动化测试脚本,由于OpenHarmony不支持脚本运行,因此无法使用,可参考其内容手动测试
OpenHarmony/third_party/yxml/yxml/out/test/test用于测试的可执行文件
OpenHarmony/third_party/yxml/yxml/out/test/*.xml测试输入文件
OpenHarmony/third_party/yxml/yxml/out/test/*.out期望的输出文件

test.sh内容如下所示:

#!/bin/sh
for i in *.xml; do
  b=`basename $i .xml`
  o=${b}.out
  t=${b}.test
  ./test <$i >$t
  if [ -n "`diff -q $o $t`" ]; then
    echo "Test failed for $i:"
    diff -u $o $t
    exit 1
  fi
done
echo "All tests completed successfully."

由于OpenHarmony的shell中暂不支持输入输出重定向(<和>),所以测试时需要将输入*.xml文件内容直接复制进shell后回车,输出内容会直接展示在shell窗口。过程如下:

下列操作假定已按照2.4节的步骤搭建OpenHarmony,挂载并进入nfs目录:

  1. 执行下列命令
   ./test
  1. 复制*.xml内容到shell
    以表3test目录下pi01.xml为例,内容如下,输入到shell并回车:
   <?SomePI abc?><a/>
  1. 比较shell中输出的内容与表3test目录中对应的*.out文件是否一致
    输出结果如下:
   pistart SomePI
   picontent abc
   piend
   elemstart a
   elemend
   ok

经比较与表3test目录下pi01.out内容一致,测试通过。

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

yxml库添加的过程除了适配文件build.gn和config.gni有些许变化外,其他和double-conversion库完全一致,参考CMake方式组织编译的库移植的配置过程。要修改的适配文件及添加后的目录结构如下:

  • yxml库新增的BUILD.gn实现如下:
import("config.gni")
group("yxml") {
    if (ohos_build_thirdparty_migrated_from_fuchisa == true) {
        deps = [":make"]
    }
}
if (ohos_build_thirdparty_migrated_from_fuchisa == true) {
    action("make") {
        script = "//third_party/yxml/build_thirdparty.py"
        outputs = ["$target_out_dir/log_yxml.txt"]
        exec_path = rebase_path(rebase_path("./yxml", root_build_dir))
        command = "make clean && $MAKE_COMMAND"
        args = [
            "--path=$exec_path",
            "--command=${command}"
        ]
    }
}
  • yxml库新增的config.gni配置如下:
TEST_ENABLE = "YES"

if (TEST_ENABLE == "YES") {
    MAKE_COMMAND = "make test OHOS_SYSROOT_PATH=${root_out_dir}sysroot/"
} else {
    MAKE_COMMAND = "make OHOS_SYSROOT_PATH=${root_out_dir}sysroot/"
}
  • 添加完成后目录结构示意:

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

名称描述
OpenHarmony/third_party/yxml/BUILD.gn将三方库加入工程的gn适配文件
OpenHarmony/third_party/yxml/build_thirdparty.pyGN调用shell命令脚本文件,由上面GN文件将相关命令传入,实现GN转Makefile
OpenHarmony/third_party/yxml/config.gni三方库编译配置文件,可修改该文件来配置用例是否参与构建等
OpenHarmony/third_party/yxml/yxml/要移植的三方库目录

为了能让大家更好的学习鸿蒙(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.coloradmin.cn/o/1608581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IOC

获取资源的传统方式&#xff1a; 在应用程序中的组件需要获取资源时&#xff0c;传统的方式是组件主动的从容器中获取所需要的资源&#xff0c;在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式&#xff0c;增加了学习成本&#xff0c;同时降低了开发效率。…

【系统分析师】项目管理

文章目录 1、范围管理2、时间(进度)管理【重点】2.0 活动资源估算2.1 进度控制2.2 关键路径法2.2.1 单代号网络图2.2.2 双代号网络图2.2.3 自由时差2.2.4 甘特图 3、配置管理3.1 配置项/配置库3.2 变更控制3.3 版本管理 4、质量管理5、成本管理5.1 成本管理的概念5.2 挣值管理 …

算法部署 | 使用TensorRT在Jetson-Xavier-AGX上部署YOLOv4目标检测算法

项目应用场景 面向 NVIDIA Jetson Xavier AGX 平台部署 YOLOv4 目标检测算法场景&#xff0c;项目采用 TensorRT 进行 GPU 算法加速推理。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装依赖 Install pycuda (takes awhile) $ cd ${HOME}/catkin_ws/src/yolov4_tr…

记录汇川:五个ST案例

起保停&#xff1a; 简单数学教学&#xff1a; 数据查找&#xff1a; 按钮检测&#xff1a; 数据堆栈&#xff1a;

16.C++常用的算法_算数生成算法

文章目录 遍历算法1. accumulate()代码工程运行结果 2. fill()代码工程运行结果 遍历算法 1. accumulate() 代码工程 第三个参数为累加的起始值&#xff0c;如果没有特殊需求写0即可; 需要注意包含头文件#include<numeric>#define _CRT_SECURE_NO_WARNINGS #include&l…

中颖51芯片学习7. ADC模数转换

中颖51芯片学习7. ADC模数转换 一、ADC工作原理简介1. 概念2. ADC实现方式3. 基准电压 二、中颖芯片ADC功能介绍1. 中颖芯片ADC特性2. ADC触发源&#xff08;1&#xff09;**软件触发**&#xff08;2&#xff09;**TIMER4定时器触发**&#xff08;3&#xff09;**外部中断2触发…

性能优化工具

CPU 优化的各类工具 network netperf 服务端&#xff1a; $ netserver Starting netserver with host IN(6)ADDR_ANY port 12865 and family AF_UNSPEC$ cat netperf.sh #!/bin/bash count$1 for ((i1;i<count;i)) doecho "Instance:$i-------"# 下方命令可以…

Java项目引入log4j2

log4j2 单独使用 引入依赖 <dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.0</version></dependency><dependency><groupId>o…

逆滤波器的推导与实现

设滤波器为&#xff0c;逆滤波器为 根据滤波器和逆滤波器的定义 对上式做傅里叶变换 对上式做逆傅里叶变换可得&#xff0c; 好了&#xff0c;逆滤波器的公式推导完了&#xff0c;但是实际计算时大多数时候这样是算不出来的&#xff0c;除非像扫频或粉噪这样的全频带信号才行&…

交流电转直流电5V500mA恒压芯片WT5104

交流电转直流电5V500mA恒压芯片WT5104 WT5104恒压芯片&#xff0c;是一种将交流电转换为直流电的设备。它的工作原理是通过内部的电路设计&#xff0c;将输入的交流电进行整流、滤波后&#xff0c;输出稳定的直流电。这款芯片最大的特点就是能够提供恒定的电压和电流&#xff…

鸿蒙 UI预览报错

SyntaxError: Unexpected end of JSON input 删除entry下的.preview文件 重新刷新预览

Ubuntu上阅读Android源码工具

由于Android源码过于庞杂&#xff0c;里面有多种语言源文件&#xff0c;想只用一IDE统一索引是不现实的。我个人便使用AS阅读JAVA代码&#xff0c;VS看C/C代码&#xff0c;在Ubuntu上不能使用SI&#xff0c;所以直接放弃。在framework开发这个层面上来讲&#xff0c;因为大部分…

C++:Hash应用【位图与布隆过滤器】

什么是位图&#xff1f; 我们先来看一个问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 如果我们使用unordered_set容器来解决&#xff0c;40亿个数据&#xff0c;每个数据…

CorelDRAW2024平面设计软件主要功能讲解

CorelDRAW是加拿大Corel公司出品的平面设计软件&#xff0c;也是一款功能强大的矢量图形制作和排版软件&#xff0c;主要面向绘图设计师和印刷输出人员。该软件提供了矢量动画、页面设计、网站制作、位图编辑和网页动画等多种功能。 CorelDRAW软件的主要用途是创建和编辑矢量图…

【Linux学习笔记】安卓设置内核信息的打印级别

开发环境 开发板&#xff1a;正点原子RK3568开发板安卓版本&#xff1a;11 问题描述 在串口调试过程中经常打印出这样的一些信息 极影响调试&#xff0c;暂时又没什么用&#xff0c;有些时候还不能给它直接关了。尤其是这个信息 healthd: battery l50 v3 t2.6 h2 st3 fc10…

mysql 重复单号 统计

任务&#xff1a; 增加重复件统计分析&#xff1a; 统计展示选择时间范围内重复1次、重复2次、重复3次、重复4次、重复5次及以上的数据量 17、统计出现的重复次数 增加重复件统计分析&#xff1a; 统计展示选择时间范围内重复1次、重复2次、重复3次、重复4次、重复5次及以上的数…

关于图像YUV格式分类和排布方式的全学习

【学习笔记】关于图像YUV格式分类和排布方式的全学习_yuv图像-CSDN博客 下图是将多个yuv420p图像(A和B)&#xff0c;拼接成一个画面的思路 A大小:416*64 B大小:416*208 将A和B合并到一个416*416的尺寸上&#xff0c;代码如下 //整合char * ptd;ptd (char * ) malloc (416*41…

Codeforces Round 939 (Div. 2)(A,B,C,D,E1,E2)

题目链接 这场不太难&#xff0c;打起来跟 d i v 3 div\ 3 div 3 一样&#xff0c;会者不难。AB找规律&#xff0c;CD构造&#xff0c;E是暴力&#xff0c;带点数学推理。 A. Nene’s Game 题意&#xff1a; 尼尼发明了一种基于整数递增序列 a 1 , a 2 , … , a k a_1, a_…

电大搜题微信公众号:重庆开放大学学子的学习利器

在当今信息化时代&#xff0c;学习已经成为每个人不可或缺的一部分。然而&#xff0c;对于重庆开放大学的学子们来说&#xff0c;由于远程教育的特殊性&#xff0c;他们面临着更大的学习挑战。幸运的是&#xff0c;他们现在可以依靠一款强大的学习利器——电大搜题微信公众号&a…

windows 11 打包python镜像相关操作

第一步&#xff1a;Docker下载 首先先到Docker官网下载最新官方Docker for Windows链接&#xff0c;点击下载之后进行安装&#xff0c;安装好之后在cmd执行 wsl --update。 第二步&#xff1a;在电脑上打开“控制面板”->“程序”-> “启动或关闭Windows功能”。 有的…