OpenHarmony构建系统实践-跨部件引用

上一篇通过gn构建系统利用部件构建了可执行程序、动态库和配置文件,以及部件内的引用,本篇通过实现跨部件的模块引用,通过实现部件间的使用方法,以此来达到复用三方部件和模块库的目的。

本节以实现两个自定义的部件为例,compdemo3部件为demo3model1_lib模块的动态库部件,compdemo4部件为demo4model1_bin模块为可执行程序部件,以此来描述如何跨部件的引用。

示例部件compdemo3和部件compdemo4完整目录结构如下

├── componentdemo3
│    ├── BUILD.gn
│    ├── bundle.json
│    ├── include
│    │     └── model1.h
│    └── src
│          └── model1.cpp
└── componentdemo4├── BUILD.gn├── bundle.json├── include│     └── model1.h└── src└── model1.cpp

 1.编写gn脚本/my_test/componentdemo3/BUILD.gn

import("//build/ohos.gni")                  # 导入编译模板,编译环境等依赖
ohos_shared_library("demo3model1_lib"){     # 动态库模块sources = [                             # 模块源码"src/model1.c"]include_dirs = [                        # 模块依赖头文件"include"]cflags = []cflags_c = []cflags_cc = []ldflags = []configs = []deps = []                               # 部件内部依赖external_deps = []                      # 跨部件的依赖,格式为"部件名:模块名"part_name = "compdemo3"                 # 模块所属部件名称
}注:复制代码时需要删除#及注释,否则无法编译通过

2.编写/my_test/componentdemo3/bundle.json 

{"name": "@ohos/compdemo3","description": "compdemo3 lib services","version": "3.1","license": "Apache License 2.0","publishAs": "code-segment","segment": {"destPath": "my_test/componentdemo3"},"dirs": {},"scripts": {},"component": {"name": "compdemo3","subsystem": "mycomptest","syscap": [],"features": [],"adapted_system_type": [ "mini", "small", "standard" ],"rom": "10KB","ram": "10KB",    "deps": {"components": [],"third_party": [],"hisysevent_config": []},"build": {"sub_component": ["//my_test/componentdemo3:demo3model1_lib"],"inner_kits": [                                      # 声明部件下那些模块允许在子系统内部使用{"type": "so"                                 # 类型为so"name": "//my_test/componentdemo3:demo3model1_lib"  # 模块"header": {                                         # 头信息"heads_files": [                                # 头文件名称"model1.h"],"header_base": "//my_test/componentdemo3/include"  # 头文件base路径}}],"test": []}}}

3.对应src下创建model1.cpp文件,include下创建model1.h文件,文件内容示例如下

model1.h

#ifndef MODEL_1_H
#define MODEL_1_H
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endifvoid HelloPrintModel1();#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif

model1.cpp

#include <stdio.h>
#include "model1.h"int main(int argc, char **argv)
{HelloPrintModel1();return 0;
}void HelloPrintModel1()
{printf("This component dir is /my_test/componentdemo3 mycomptest->compdemo3->demo3model1_lib\n");
}

4.编写gn脚本/my_test/componentdemo4/BUILD.gn

import("//build/ohos.gni")                      # 导入编译模板,编译环境等依赖
ohos_executable("demo4model1_bin"){             # 可执行模块sources = [                                 # 模块源码"src/model.cpp"]include_dirs = [                            # 模块依赖头文件"include"]cflags = []cflags_c = []cflags_cc = []ldflags = []configs = []deps = []                                   # 部件内部依赖external_deps = [compdemo3:demo3model1_lib] # 跨部件的依赖,格式为"部件名:模块名",引入外部部件的模块part_name = "compdemo4"                     # 模块所属部件名称install_enable = true                       # 是否安装(缺省默认不安装)
}注:复制代码时需要删除#及注释,否则无法编译通过

 5.编写/my_test/componentdemo4/bundle.json

{"name": "@ohos/compdemo4","description": "compdemo4 services","version": "3.1","license": "Apache License 2.0","publishAs": "code-segment","segment": {"destPath": "my_test/componentdemo4"},"dirs": {},"scripts": {},"component": {"name": "compdemo4","subsystem": "mycomptest","syscap": [],"features": [],"adapted_system_type": [ "mini", "small", "standard" ],"rom": "10KB","ram": "10KB",    "deps": {"components": ["compdemo3"],         # 引入外部部件compdemo3"third_party": [],"hisysevent_config": []},"build": {"sub_component": ["//my_test/componentdemo4:demo4model1_bin"],"inner_kits": [],"test": []}}}

6.对应src下创建model.cpp文件,include下创建model.h文件,文件内容示例如下

 model.h

#ifndef MODEL_H
#define MODEL_H
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endifvoid HelloPrint();#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif

model.cpp

#include <stdio.h>
#include "model.h"int main(int argc, char **argv)
{HelloPrint();return 0;
}void HelloPrint()
{printf("This component dir is /my_test/componentdemo4, mycomptest->compdemo4->demo4model_bin\n");
}

7.在/build/subsystem_config.json文件最后增加如下内容

  ,"mycomptest": {"path": "my_test","name": "mycomptest"}...
}# 注:以上...}代表内容放在文件最后一级}下

 注:subsystem_config.json文件此处的"subsystem": "mycomptest"为bundle.json中的"subsystem": "mycomptest"。

8.在/vender/{产品解决方案厂商}/{产品名称}/config.json文件最后增加如下内容,如rk3568芯片则路径为:/vendor/hihope/rk3568/config.json

    ,{"subsystem":"mycomptest","components": [{"component": "compdemo3","features": []},{"component": "compdemo4","features": []}]}...]
}注:以上...]}代表以上内容放在文件中最后一级数组中

注:config.json文件中此处的"subsystem":"mycomptest"为subsystem_config.json文件中的"name": "mycomptest";"component": "compdemo3"和"component": "compdemo3"为BUILD.gn中的part_name = "compdemo3"和part_name = "compdemo4"。

9.编译

可以使用整编命令

./build.sh --product-name rk3568 --no-prebuilt-sdk

也可以使用“–build-target 模块名"单独编译,编译命令如下:

./build.sh  --product-name rk3568 --build-target demo4model1_bin --ccache

还可以编译模块所在的部件:

./build.sh --product-name rk3568 --build-target compdemo4 --ccache

10.烧录到设备后,输入模块命令即可打印

demo4model1_bin

后记:

gn 中其他用法

1.成员变量

import("//build/ohos.gni") abc = true
bcd = "123"...if(abc == false){print("This priint is gn key abc is false")
}if(bcd == "123") {print("This priint is gn key bcd is 123")
}if(defined(abc)) {                        # 变量被定义print("This priint is gn key abc define")
}

2.gn定义宏变量

import("//build/ohos.gni")
ohos_shared_library("demo3model1_lib"){...defines = ["SN"]                          # 定义宏变量方式1cflags = ["-DUUID"]                       # 定义宏变量方式2 -DXXX,中间无空格cflags_c = []cflags_cc = []ldflags = []configs = []...
}注:复制代码时需要删除#及注释,否则无法编译通过

在c代码中使用

#include <stdio.h>
#include "model1.h"int main(int argc, char **argv)
{HelloPrintModel1();return 0;
}void HelloPrintModel1()
{
#ifdef SNprintf("This define SN print");
#endif
#ifdef UUIDprintf("This define UUID print");
#endifprintf("This component dir is /my_test/componentdemo3 mycomptest->compdemo3->demo3model1_lib\n");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70793.shtml

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

相关文章

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…

Windows 11【1001问】如何安装Windows 11

紧接上篇内容&#xff0c;本文详细介绍了从准备工作到具体安装步骤的完整流程&#xff0c;帮助用户顺利完成Windows 11系统的安装。内容涵盖了ISO镜像文件的下载与校验、启动U盘的制作、硬件兼容性检查&#xff0c;以及BIOS/UEFI设置和系统安装过程中的关键步骤。通过逐步指导&…

Chromedriver与Chrome版本映射表

‌Chromedriver与Chrome版本映射表‌如下&#xff1a; ‌Chrome 71-73版本对应Chromedriver 2.46‌‌Chrome 70-72版本对应Chromedriver 2.45‌‌Chrome 69-71版本对应Chromedriver 2.44‌‌Chrome 68-70版本对应Chromedriver 2.43‌‌Chrome 67-69版本对应Chromedriver 2.42‌…

LSM-Tree (日志结构合并树)

LSM-Tree&#xff08;日志结构合并树&#xff09;是一种高效处理写操作的存储结构&#xff0c;广泛应用于NoSQL数据库如LevelDB和RocksDB。其核心思想是将随机写入转换为顺序写入&#xff0c;提升吞吐量。以下是其原理及Java实现示例&#xff1a; ### **LSM-Tree 原理** 1. **…

【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)

《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…

3-提前结束训练

一、核心类 class EarlyStopping:# YOLOv5 simple early stopperdef __init__(self, patience30):self.best_fitness 0.0 # i.e. mAPself.best_epoch 0self.patience patience or float(inf) # epochs to wait after fitness stops improving to stopself.possible_stop …

若依 ruoyi-vue 根据角色切换路由菜单权限 SAAS

后端根据角色查询相应的菜单&#xff08;角色对应管理的系统&#xff09; /*** 获取路由信息根据角色&#xff08;系统类型&#xff09;** return 路由信息*/GetMapping("getRoutersBySystemType")public AjaxResult getRoutersBySystemType(String systemType) {Lon…

2024最新版鸿蒙纯血原生应用开发教程文档丨学习ArkTS语言-基本语法

ArkTS是HarmonyOS的主要应用开发语言&#xff0c;在TypeScript基础上进行了扩展&#xff0c;保留了其基本风格&#xff0c;并通过增强静态检查和分析来提高程序的稳定性和性能。本教程将帮助开发者掌握ArkTS的核心功能、语法及最佳实践&#xff0c;以便高效地构建高性能移动应用…

使用插件 `vue2-water-marker`添加全局水印

使用插件 vue2-water-marker添加全局水印 效果图 1、安装插件 npm install vue2-water-marker --save2、全局注册 // main.js import Vue from vue import Vue2WaterMarker from vue2-water-markerVue.use(Vue2WaterMarker)3、在组件中使用 <template><div id&q…

docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结

官方网站 官方网址&#xff1a;etcd 二进制包下载&#xff1a;Install | etcd GitHub社区项目&#xff1a;etcd-io GitHub GitHub社区项目版本历史&#xff1a;Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…

探索浮点数在内存中的存储(附带快速计算补码转十进制)

目录 一、浮点数在内存中的存储 1、常见的浮点数&#xff1a; 2、浮点数存储规则&#xff1a; 3、内存中无法精确存储&#xff1a; 4、移码与指数位E&#xff1a; 5、指数E的三种情况&#xff1a; 二、快速计算补码转十进制 1、第一种方法讨论&#xff1a; 2、第二种方…

第25周JavaSpringboot实战-电商项目 4.商品分类管理

商品分类模块开发笔记 模块功能概述 实现分类数据的 增删改查 功能核心难点&#xff1a; 分类的父子级目录结构递归实现多级分类查找列表展示顺序控制&#xff08;从父级向子级递归&#xff09; 接口说明 后台接口 1. 添加分类 请求地址: /admin/category/add 请求方法: …

【星云 Orbit-F4 开发板】03g. 按键玩法七:矩阵键盘单个触发

【星云 Orbit-F4 开发板】03g. 按键玩法七&#xff1a;矩阵键盘单个触发 引言 矩阵键盘是一种常见的输入设备&#xff0c;广泛应用于各种嵌入式系统中。通过矩阵键盘&#xff0c;用户可以通过按键输入字符或控制信号。本文将详细介绍如何使用STM32F407的GPIO引脚实现矩阵键盘的…

Milvus x DeepSeek 搭建低成本高精度 RAG 实战

为什么手握海量数据&#xff0c;却用不出真正的“智能”&#xff1f;要么 AI 模型学艺不精&#xff0c;答非所问&#xff1b;要么技术门槛太高&#xff0c;让普通开发者望而却步。现在&#xff0c;使用阿里云 Milvus 向量检索服务、DeepSeek 大模型和 PAI LangStudio 开发工具&…

每日一题——两数之和

两数之和 问题描述示例提示思路分析代码实现代码解析1. 哈希表结构体定义2. 初始化哈希表3. 释放哈希表内存4. 主函数 twoSum5. 返回结果复杂度分析 第二种解法代码功能概述代码详细注释1. 哈希表结构体定义2. 哈希表指针3. 查找函数4. 插入函数5. 两数之和函数 6. 主函数&…

2025年SCI1区TOP:真菌生长优化算法FGO,深度解析+性能实测

目录 1.摘要2.算法原理3.结果展示4.参考文献5.代码获取 1.摘要 本文提出了一种新型的自然启发元启发式算法——真菌生长优化算法&#xff08;FGO&#xff09;&#xff0c;灵感来源于真菌在自然界中的生长行为。真菌的生长行为包括菌丝生长、分枝和孢子萌发&#xff0c;菌丝生长…

穿越AI边界:深度集成DeepSeek API与云平台的实践之路

云边有个稻草人-CSDN博客 随着人工智能技术的日益发展&#xff0c;深度学习和自然语言处理&#xff08;NLP&#xff09;已经在很多领域得到了广泛的应用。DeepSeek作为一款领先的大型语言生成模型&#xff0c;凭借其强大的推理和生成能力&#xff0c;已经被越来越多的开发者和…

动态表头导出EasyExcel

在 Spring Boot 中结合 EasyExcel 实现动态表头导出&#xff08;无实体类&#xff0c;表头和字段&#xff08;前端传表名&#xff0c;字段值动态查询&#xff0c;返回List<Map<String,Object>>&#xff09;由前端传递&#xff09;可以通过以下步骤实现。以下是完整…

1 | 从零开始解密数据库:数据库基础概念

❤个人主页&#xff1a;折枝寄北的博客 ❤专栏位置&#xff1a;数据库专栏 目录 前言1. 数据&#xff08;data&#xff09;2. 数据库(DB)3. 数据库管理系统(DBMS)4. 数据库系统(DBS) 感谢您的阅读支持 前言 【前言】 在万物互联的数字时代&#xff0c;数据已成为驱动社会运转…

Web自动化之Selenium下Chrome与Edge的Webdriver常用Options参数

目录 引言 说明 Add_argument() 添加方式 常用参数 Add_experimental_option() 添加方式 常用方法 任务结束后仍然保持浏览器打开 禁用“Chrome 正受到自动测试软件的控制”提示 设置下载路径 禁用弹窗拦截 禁用图片加载 禁用 JavaScript 注意 引言 …