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

以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:=clangAR:=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:=gccAR:=arCFLAGS:=-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; dob=`basename $i .xml`o=${b}.outt=${b}.test./test <$i >$tif [ -n "`diff -q $o $t`" ]; thenecho "Test failed for $i:"diff -u $o $texit 1fi
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 SomePIpicontent abcpiendelemstart aelemendok

经比较与表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.mzph.cn/news/811635.shtml

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

相关文章

基于机器学习的识别准确率不高问题

识别准确率不高&#xff0c;可能存在以下几个方面的原因&#xff1a; 数据质量&#xff1a;数据集中可能存在错误、不完整或与实际情况偏离的情况。数据清洗和预处理是解决这个问题的关键。 数据不平衡&#xff1a;某些类别的样本过多&#xff0c;而其他类别的样本过少&#x…

sklearn的LabelEncoder 遇到新值的解决办法

问题&#xff1a;sklearn的LabelEncoder函数遇到新值报错 sklearn的LabelEncoder函数&#xff0c;在fit结束后&#xff0c;对dataframe数据进行transform的时候&#xff0c;如果遇到了没在fit时编码规则里的新值&#xff0c;会出现代码报错&#xff0c;不同于spark的LabelEnco…

SQL中的INNER JOIN与笛卡尔积:区别与实例详解

SQL中的INNER JOIN与笛卡尔积&#xff1a;区别与实例详解 引言1. 笛卡尔积&#xff08;Cartesian Product&#xff09;定义与概念结果特点 2. INNER JOIN定义与概念结果特点 3. 区别与比较4. 实例演示5. 总结 引言 在SQL查询中&#xff0c;INNER JOIN和笛卡尔积&#xff08;Car…

【示例】Mybatis-标签学习+Mybatis工作流程

前言 本文主要学习Mybatis相关标签的使用及Mybatis的工作流程。 文中用到的示例&#xff0c;代码存储位置&#xff1a; GitHubhttps://github.com/Web-Learn-GSF/Java_Learn_Examples父工程Java_Framework_Mybatis 基础 示例 | 初始Mybatis 数据库初始化 -- 建表 CREATE…

深入探索自然语言处理:用Python和BERT构建文本分类模型

在当今的信息时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术正在改变我们理解和处理自然语言的方式。NLP使计算机能够解读、理解和生成人类语言&#xff0c;从而在多种应用中实现自动化&#xff0c;如聊天机器人、情感分析和文本分类。本文将详细介绍如何使用Py…

Elasticsearch安装、启动异常问题总结

安装es、kibana、ik分词器可参考&#xff1a;http://t.csdnimg.cn/59mEG 1. 内核过低 我们使⽤的是 centos6 &#xff0c;其 linux 内核版本为 2.6 。⽽ Elasticsearch 的插件要求⾄少 3.5 以上版 本。不过没关系&#xff0c;我们禁 ⽤这个插件即可。 修改 elasticsearch.ym…

俄罗斯游戏市场分析与海外营销策略洞察

俄罗斯作为全球十大经济体之一&#xff0c;拥有广阔的游戏市场。以下是对俄罗斯游戏市场的一些关键要素的分析&#xff1a; 人口基础&#xff1a;俄罗斯人口众多&#xff0c;游戏用户群体庞大。根据统计数据&#xff0c;俄罗斯的游戏人口超过7000万&#xff0c;占其总人口的相当…

spring boot整合Redis监听数据变化

一、前言 Redis提供了数据变化的通知事件&#xff0c;可以实时监测key和value的变化&#xff0c;客户端可以通过订阅相关的channel来接收这些通知事件&#xff0c;然后做相应的自定义处理&#xff0c;详细的介绍可以参考官方文档Redis keyspace notifications | Docs 使用Red…

使用element-plus中的表单验证

标签页代码如下&#xff1a; // 注意&#xff1a;el-form中的数据绑定不可以用v-model&#xff0c;要使用:model <el-form ref"ruleFormRef" :rules"rules" :model"userTemp" label-width"80px"><el-row :gutter"20&qu…

一次http访问超时服务器端调试

问题&#xff1a;http访问服务器时没有返回&#xff0c;没有超时&#xff0c;一直在阻塞 处理过程&#xff1a;telnet端口能连上&#xff0c;服务端程序也不存在处理时间过长的情况。 说明tcp连接没问题。推测是客户端连接后再发起请求&#xff0c;服务端阻塞了。因为很多客户…

关于 TDengine 的时区(timeZone)问题

背景 在学习SagooIOT物联网平台使用docker部署TDengine时序数据库&#xff0c;根据时间戳&#xff08;timestamp&#xff09;ts查询上报设备数据时 发现结果跟查询条件不匹配。查询问题原因竟然是timezone时区设置问题。 查询数据结果&#xff1a; 查看容器时区&#xff1a; …

分类算法——sklearn转换器和估计器(一)

转换器&#xff08;特征工程的父类&#xff09; 实例化&#xff08;实例化的是一个转换器类&#xff08;Transformer&#xff09;&#xff09;调用fit_transform&#xff08;对于文档建立分类词频矩阵&#xff0c;不能同时调用&#xff09; 把特征工程的接口称之为转换器&…

什么是跨域?

跨域&#xff08;Cross-Origin&#xff09;指的是在Web开发中&#xff0c;一个网页的资源&#xff08;例如脚本、样式表、图片等&#xff09;请求另一个源的资源时&#xff0c;两个源的协议、域名或端口不相同。简单来说&#xff0c;当浏览器试图从一个源加载来自不同源的资源时…

当你的项目体积比较大?你如何做性能优化

在前端开发中&#xff0c;项目体积优化是一个重要的环节&#xff0c;它直接影响到网页的加载速度和用户体验。随着前端项目越来越复杂&#xff0c;引入的依赖也越来越多&#xff0c;如何有效地减少最终打包文件的大小&#xff0c;成为了前端工程师需要面对的挑战。以下是一些常…

汽车咨询|基于SprinBoot的汽车资讯管理系统设计与实现(源码+数据库+文档)

汽车资讯管理系统目录 基于SprinBoot的汽车资讯管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff…

npm 切换成淘宝源,以及遇到npm 报错如何解决

淘宝源&#xff1a;npm config set registryhttps://registry.npmmirror.com/ 然后再npm下 package-lock.json这个删了 npm i再试一下

MySQL——创建和插入

一、插入数据 INSERT 使用建议; 在任何情况下建议列出列名&#xff0c;在 VALUES 中插入值时&#xff0c;注意值和列的意义对应关系 values 指定的值顺序非常重要&#xff0c;决定了值是否被保存到正确的列中 在指定了列名的情况下&#xff0c;你可以仅对需要插入的列给到…

【已解决】VMware Horizon Client: 无法建立安全加密链路连接

文章目录 问题原因解决方法方法1&#xff1a;在HTTPS拦截中添加VMware忽略列表 (推荐)方法2&#xff1a; 只拦截 浏览器进程的请求 / 取消 HTTPS 拦截&#xff08;如果没有拦截HTTPS的必要 / 只针对浏览器请求&#xff0c;可以使用此方法&#xff09; 当前使用mac 编辑&#xf…

Vue中$attrs的作用和使用方法

Vue中$attrs的作用和使用方法 1. 使用场景举例2. 官方解释3. 使用示例 $attrs是 vue2.4.0版本以上新增的属性&#xff1b; 1. 使用场景举例 假如我们现在要二次封装一个组件&#xff0c;我们需要把当前组件获取到的所有的props都传递给子组件&#xff0c;我们可以在当前组件中…

飞书api增加权限

1&#xff0c;进入飞书开发者后台&#xff1a;飞书开放平台 给应用增加权限 2&#xff0c;进入飞书管理后台 https://fw5slkpbyb3.feishu.cn/admin/appCenter/audit 审核最新发布的版本 如果还是不行&#xff0c;则需要修改数据权限&#xff0c;修改为全部成员可修改。 改完…