Openharmony添加编译自己应用

news2024/11/24 14:20:27

介绍一下Openharmony如何在庞大的编译构建系统中,增添自己想编译的内容。不定期更新~🐸

gn官方文档:

  • https://gn.googlesource.com/gn/+/main/docs/quick_start.md
  • https://gn.googlesource.com/gn/+/master/docs/reference.md

openharmony官方build文档:

  • build: Compilation and building framework and scripts | 编译构建框架和脚本
  • zh-cn/device-dev/subsystems/subsys-build-module.md · OpenHarmony/docs - Gitee.com
AuthorDateVersionDescription
陈梓归、唐凯文2023-05-15V1.0第一个版本

 1. 编译自带libdrm/modeset程序

OH的源码环境下third_party/libdrm/tests下是有测试程序的,但是不会编译,需要自己写BUILD.gn来进行编译;

1.1 modeset添加BUILD.gn

  • 注意:只有sources和part_name是必选,其他都是可选的;
##  third_party/libdrm/tests/modetest/BUILD.gn
# 使用模板,用import,类似C语言的#include
import("//build/ohos.gni")
# 生成可执行文件,叫作modetest
ohos_executable("modetest"){
    # 依赖编译相关文件
    sources = [
        "buffers.c",
        "cursor.c",
        "modetest.c",
    ]
    cflags = [
        "-Wno-pointer-arith",
    ]
    include_dirs = [
        "../",
        ".",
    ]

    # 配置
    configs = [ "//third_party/libdrm:libdrm_config" ]
    public_configs = [ "//third_party/libdrm:libdrm_public_config" ]

    # 部件内模块依赖
    deps = [
        "//third_party/libdrm:libdrm",
        "//third_party/libdrm/tests/util/:util",
    ]
    public_deps = []
    
    # 可选,缺省在/system/lib64或/system/lib下, 模块安装路径,模块安装路径,从system/,vendor/后开始指定
    # module_install_dir = ""
    # 可选,模块安装相对路径,相对于/system/lib64或/system/lib;如果有module_install_dir配置时,该配置不生效  
    # relative_install_dir = "" 
    # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个
    install_images = [
        "system",
    ]
    # 必选,所属部件名称
    part_name = "graphic_standard"
    # 可选,所属子系统名称
    subsystem_name = "graphic"
}

1.2 为 modetest构建依赖util

在前面的BUILD.gn中我们看到了modeset依赖了util,所以我们这里必须为util构建编译脚本!

因为libdrm会自动构建,所以我们不需要自己构建编译啦😄

## third_party\libdrm\tests\util\BUILD.gn
import("//build/ohos.gni")

ohos_static_library("util"){
    sources = [
        "format.c",
        "kms.c",
        "pattern.c",
    ]

    include_dirs = [
        "../",
        "."
    ]

    configs = [ "//third_party/libdrm:libdrm_config" ]

    public_configs = [ "//third_party/libdrm:libdrm_public_config" ]
    cflags = [
        "-Wno-unused-variable",
        "-Wno-sign-compare",
    ]

    deps =[
        "//third_party/libdrm:libdrm",
    ]
    public_deps = []
}

1.3 将modetest加入到OHOS编译系统

这里比较简单,可以搜一搜哪个编译的依赖libdrm,然后选择一个加入到BUILD.gn即可

  • 搜索//third_party/libdrm:libdrm
 deps = [
    "//third_party/libdrm:libdrm",
    "//third_party/libdrm/tests/util/:util",
    "//third_party/libdrm/tests/modetest/:modetest",
  ]

1.4 编译

  • --build-target=ohos_executable的名字

编译命令:./build.sh --product-name d2000 --target-cpu arm64 --build-target=modeset --jobs=100

  • 报错:
../../third_party/libdrm/tests/util/pattern.c:988:8: error: unused variable 'mem_base' [-Werror,-Wunused-variable]
  • 解决:
第一个方法:屏蔽这行
第二个方法:修改cflags参数
注意这里的cflags需要添加到libdrm下面的BUILD.gn才可以,不然也会编译不过!
修改libdrm文件下面的BUILD.gn加入
        "-Wno-unused-variable",
        "-Wno-sign-compare",
        "-Wno-pointer-sign",
        "-Wno-deprecated-declarations",

2. 添加自己应用

2.1 在libdrm下建立对应的fovt_app文件夹

  • 增加对应的gn文件和.c文件,然后按照上面的方法增加到一个编译里面去;
  • gn
#fovt test application
import("//build/ohos.gni")

#单独编译它
#./build.sh --product-name d2000 --target-cpu arm64 --build-target=atomic_test
ohos_executable("atomic_test"){
    sources = [
        "atomic_test.c",
    ]
    output_name = "atomic_test"

    cflags = [
        "-Wno-pointer-arith",
    ]

    include_dirs = [
        "../",
        ".",
    ]

    configs = [ "//third_party/libdrm:libdrm_config" ]

    public_configs = [ "//third_party/libdrm:libdrm_public_config" ]

    deps = [
        "//third_party/libdrm:libdrm",
    ]

    public_deps = []

    install_images = [
        "system",
    ]
    part_name = "graphic_standard"
    subsystem_name = "graphic"
}

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

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

相关文章

Salesforce退出市场后类似的CRM系统有哪些

Salesforce退出中国市场后,对很多使用Salesforce的国内企业来说是一个不小的打击。他们需要寻找与Salesforce功能相当、具有良好口碑的CRM客户管理系统来替代。本文就为大家推荐五款类似Salesforce的CRM系统。 1、Zoho CRM Zoho CRM是一款SaaS云端CRM系统&#xf…

005: vue中el-upload 组件添加token的方法

第005个 查看专栏目录: 按照VUE知识点 ------ 按照element UI知识点 echarts,openlayers,cesium,leaflet,mapbox,d3,canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下,本专栏…

谈谈嵌入式开发中签名校验和加解密作用的理解

1、前言 本博文不是讲解可信加签和固件加密的具体原理,而是谈谈实际嵌入式开发中,可信加签和固件加密的应用场景,可以帮助从事嵌入式开发的人员快速理解加签和加密的作用。 2、嵌入式开发中可信加签和固件加密介绍 (1)各家公司都有自己的可信…

操作受限的线性表——栈

本文主要内容:本文主要讲解栈的基本概念、基本操作和栈的顺序、链式实现。 目录 栈一、栈的基本概念1、基本概念2、基本操作 二、栈的顺序存储结构1、顺序栈的实现2、顺序栈的基本运算1)初始化2)判栈空3)进栈4)出栈5&a…

【环境配置】C/C++第三方库管理工具vcpkg安装和使用

一,vcpkg简介 vcpkg是微软公司开发的一个开源C包管理工具,它可以很方便的帮助您在 Windows、 Linux 和 MacOS 上下载,编译和安装C 第三方库。它具有自动解决依赖关系的能力,并且支持多种目标架构和平台。提供了超过1500个C库的预…

【Ubuntu系统内核更新与卸载】

【Ubuntu系统内核更新与卸载】 1. 前言2. 内核安装2.1 系统更新2.2 官网下载 3. 内核卸载3.1 需求分析3.2 卸载方法 1. 前言 我们在搭建环境时常常遇到内核版本不匹配的问题,需要我们安装新的内核版本;有时又会遇到在安装软件时报错boot空间已满无法安装…

Python爬取影评并进行情感分析和数据可视化

Python爬取影评并进行情感分析和数据可视化 文章目录 Python爬取影评并进行情感分析和数据可视化一、引言二、使用requestsBeautifulSoup进行影评的爬取1、分析界面元素2、编写代码 三、情感分析1、数据预处理2、情感分析3、数据可视化 一、引言 前几天出了《航海王&#xff1…

N - Cthulhu

第三次题组 [Cloned] - Virtual Judge (vjudge.net) 【题目描述】 一个具有 n 个顶点和 m 条边的无向图。现在,世界上最好的头脑即将确定这张图是否可以被视为克苏鲁。 为了简单起见,让我们假设克苏鲁从空间里看起来就像一个附有触手的球形身体。从形式…

sqlserver存储过程中使用临时表的问题

2023年6月6日08:52:15 因为最近接触的his系统一些存储过程做数据统计,一个存储过程就要使用1-3个临时表,这些存储过程是零几年的写得,和我们这个时代的写的存储过程习惯不太一样,就好奇为什么要使用这么多的临时表 临时表的基本概…

结构型设计模式05-组合模式

🧑‍💻作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 组合模式 1、组合模式介绍 组合模式(Composite Pattern),又叫部分…

Generator-Evaluator重排模型在淘宝流式场景的实践

除了相关性,复杂信息流推荐场景还需要兼顾多样的业务需求,包括打散(多样性),流量调控,多展示形态/多路供给融合等。传统推荐系统采用pipeline的形式,分步处理上述需求,缺少统筹优化&…

【博客650】irate适用于绘制细粒度灵敏图,但警惕用于告警

irate适用于绘制细粒度灵敏图,但警惕用于告警 1、irate解析 作用: irate(v range-vector) 函数用于计算区间向量的增长率,但是其反应出的是瞬时增长率。 原理: irate 函数是通过区间向量中最后两个两本数据来计算区间向量的增长…

C++表达式模板教程:从原理到应用的全面解析

C表达式模板教程 1. C表达式模板的引入 (Introduction to C Expression Templates)1.1 表达式模板的定义和作用 (Definition and Role of Expression Templates)1.2 表达式模板的历史和发展 (History and Development of Expression Templates)1.3 表达式模板在现代C中的地位 (…

java springboot VUE 在线学习平台系统开发mysql数据库web结构java编程计算机网页源码maven项目前后端分离

一、源码特点 springboot VUE 在线学习平台系统是一套完善的完整信息管理类型系统 前后端分离,结合springboot框架和VUE完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架 (MVC模式开发),系统具有…

005Mybatis返回值(ResultMap 一对多,多对多)

属性 id 应该总是指定一个或多个可以唯一标识结果的属性。 虽然,即使不指定这个属性,MyBatis 仍然可以工作,但是会产生严重的性能问题。 只需要指定可以唯一标识结果的最少属性。显然,你可以选择主键(复合主键也可以…

DevOps系列文章之 远程部署的一种方案

远程部署的一种方案 sshpass 一个简单、轻量级命令行工具,提供非交互式密码验证 原理 ssh 直接使用 TTY 访问,以确保密码是用户键盘输入的。 sshpass 在专门的 tty 中运行 ssh,以误导 ssh 相信它是从用户接收到的密码使用 sshpass 是不安…

深入理解HashMap源码

文章目录 HashMap简介源码分析关键参数获取数组下标put方法resize扩容过程jdk1.7的扩容实现jdk1.8的扩容实现 get()方法remove()方法 总结 关于HashMap,一直都是一个非常热门的话题,只要你出去面试,一定少不了它! 本文主要结合 JD…

English Learning - L3 作业打卡 Lesson5 Day35 2023.6.8 周四

English Learning - L3 作业打卡 Lesson5 Day35 2023.6.8 周四 引言🍉句1: Publishers know that some people are self-conscious about what they read on public transport and so they put out different versions of a cover.成分划分弱读连读爆破语调 &#x…

实现表白墙

我们已经学习了Http以及Servlet类的相关知识 今天我们来实操一下,实现一个简单的既有前端又有后端的网站–表白墙 之前在学习前端的时候已经写过了表白墙的前端代码,存在两个问题 1.页面重启,数据丢失 2.数据只是在本地的,别人看不见 那么这样的问题我们要咋样解决呢? 引入…

黑马Redis视频教程高级篇(二:多级缓存)

目录 一、什么是多级缓存? 二、JVM进程缓存 2.1、导入案例 2.2、初识Caffeine 2.3、实现JVM进程缓存 2.3.1、需求 2.3.2、实现 三、Lua语法入门 3.1、初识Lua 3.2、HelloWord 3.3、变量和循环 3.3.1、Lua的数据类型 3.3.2、声明变量 3.3.3、循环 3.4…