鸿蒙北向开发 ubuntu20.04 gn + ninja环境傻瓜式搭建闭坑指南

news2024/10/5 21:13:50

ninja跟gn都是比较时髦的东西,由歪果仁维护,如果走下载源码并编译这种流程的话需要走github跟google官网下载,国内的用网环境相信各位傻瓜都知道,github跟google这几年基本是属于连不上的状态,好在你看的鸿蒙项目跟国内的一些软件大厂已经帮你爬过梯子了,ninja工具跟gn工具已经被他们搬到国内来了

一.安装ninja

关于ninja的介绍网上还是比较多的,这里就不多讲了.贴一个写的不错的帖子各位可以去看看

ninja

相信你看过上面的帖子,对ninja基本上算是有个不错的概念认知,各个社区都集成了ninja,那么为什么大家都集成ninja呢?ninja专注于构建速度,最关键的是ninja可以配合cmake一起使用且ninja极其的小巧轻便

ninja的安装比较简单

$ sudo apt install ninja-build

 使用如下指令查看安装的ninja版本,能查出版本即证明ninja安装成功

$ ninja --version

二.安装gn,源码编译

gn的安装稍微有点麻烦,gn需要前置clang,我当前的虚拟机是ubuntu20.04lts版本

这个版本的ubuntu apt源中配置了clang,直接通过如下指令下载

sudo apt install clang

因为我这台虚拟机已经安装过了clang,如下提示表示我的clang已经是最新版本了

使用

$ clang --version

查看当前clang版本

gn的源码编译需要clang-8以上的支持,各位根据自己当前系统情况善用百度安装clang-8以上版本

下载gn源码

gn的源码可以从多个地方下载,google官方的跟GitHub上有fork的仓库的需要科学上网,唯一能用的就是鸿蒙提供的Gitee的仓库

鸿蒙gitee

但是鸿蒙gitee下载的有点问题,下载下来后编译出来的测试程序有问题,我就没有继续了,具体什么原因还不太清楚

刚好我手里有开源鸿蒙4.1主干版本,我从主干上复制出来了gn源码,现已上传到csdn下载

gn 源码下载

将源码复制到ubuntu系统里面

进入gn目录

$ cd gn
$ python build/gen.py
$ ninja -C out

如上表示编译执行成功,跑一下测试代码

$ ./out/gn_unittests

如上表示测试成功

编译成功后,将gn复制到/usr/bin目录下

$ sudo cp ./out/gn /usr/bin

/usr/bin 目录就是系统默认添加环境变量的目录,将gn放到这个目录后可以在任一新建终端测试gn是否可用

新建终端:输入 gn help

如上表示gn安装成功

三.简单的测试

gn测试命令

ninja命令

建议初学者以gn仓为例进行学习,首先进入gn/examples/simple_build文件夹,该文件夹下BUILD.GN描述了一个最基本的C++文件的编译配置,如下可执行程序hello依赖了动态库文件hello_shared以及静态库hello_static。

# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
executable("hello") {
  sources = [ "hello.cc" ]
  deps = [
    ":hello_shared",
    ":hello_static",
  ]
}
shared_library("hello_shared") {
  sources = [
    "hello_shared.cc",
    "hello_shared.h",
  ]

  defines = [ "HELLO_SHARED_IMPLEMENTATION" ]
}
static_library("hello_static") {
  sources = [
    "hello_static.cc",
    "hello_static.h",
  ]
}

在目录下执行gn gen -C out同时进入out文件夹下,分别执行以下命令。

  • gn ls out

    //:hello
    //:hello_shared
    //:hello_static
    

    该命令列出了gn编译过程中的所有target列表,可以看出,包含一个可执行程序//:hello、一个动态库//:hello_shared和一个静态库//:hello_static。

  • gn refs out //:hello_shared

    //:hello
    

​ gn refs列出了哪些目标依赖了目标//:hello_shared,从上面可以看出目标//:hello依赖了目标//:hello_shared,从GN配置文件也可以看出来。

  • gn desc out //:hello_shared

    Target //:hello_shared
    type: shared_library
    toolchain: //build/toolchain:gcc
    
    visibility
      *
    
    metadata
      {
    
      }
    
    testonly
      false
    
    check_includes
      true
    
    allow_circular_includes_from
    
    sources
      //hello_shared.cc
      //hello_shared.h
    
    public
      [All headers listed in the sources are public.]
    
    configs (in order applying, try also --tree)
      //build:compiler_defaults
    
    outputs
      //out/libhello_shared.so
    
    cflags
      -fPIC
      -pthread
    
    defines
      HELLO_SHARED_IMPLEMENTATION
    
    Direct dependencies (try also "--all", "--tree", or even "--all --tree")
    
    externs
    

    gn desc查看目标//:hello_shared的所有信息,这个命令非常实用,记录了目标的visibility、metadata、cflags、defines等重要信息,建议开发者多使用该功能进行调试。

  • gn path out //:hello //:hello_shared

    //:hello --[private]-->
    //:hello_shared
    
    1 non-data path found. It is not public.
    

    查看两个目标之间的依赖路径。从上面我们可以看出,//:hello和//:hello_shared是私有依赖的关系,且两者是直接依赖的。

  • gn args --list out

    current_cpu
        Current value (from the default) = ""
          (Internally set; try `gn help current_cpu`.)
    
    current_os
        Current value (from the default) = ""
          (Internally set; try `gn help current_os`.)
    
    host_cpu
        Current value (from the default) = "x64"
          (Internally set; try `gn help host_cpu`.)
    
    host_os
        Current value (from the default) = "linux"
          (Internally set; try `gn help host_os`.)
    
    target_cpu
        Current value (from the default) = ""
          (Internally set; try `gn help target_cpu`.)
    
    target_os
        Current value (from the default) = ""
          (Internally set; try `gn help target_os`.)
    

    查看编译过程中的gn参数列表。

  • gn check out

    Header dependency check OK
    

    查看编译过程中的头文件依赖是否正确。

  • gn format find . -name "*.gni" -o -name "*.gn"

    上述命令可以格式化当前文件夹下的所有GN文件,包括.gni文件和.gn文件。

下面是ninja命令测试 在simple_build目录下执行如下指令

  • ninja -C out -v

    ninja: Entering directory `out'
    [1/6] g++ -MMD -MF obj/libhello_static.hello_static.o.d   -fPIC -pthread  -c ../hello_static.cc -o obj/libhello_static.hello_static.o
    [2/6] g++ -MMD -MF obj/libhello_shared.hello_shared.o.d -DHELLO_SHARED_IMPLEMENTATION  -fPIC -pthread  -c ../hello_shared.cc -o obj/libhello_shared.hello_shared.o
    [3/6] g++ -MMD -MF obj/hello.hello.o.d   -fPIC -pthread  -c ../hello.cc -o obj/hello.hello.o
    [4/6] rm -f obj/libhello_static.a && ar rcs obj/libhello_static.a obj/libhello_static.hello_static.o
    [5/6] g++ -shared  -o ./libhello_shared.so -Wl,-soname=libhello_shared.so @libhello_shared.so.rsp
    [6/6] g++ -Wl,-rpath=\$ORIGIN/ -Wl,-rpath-link= -o hello -Wl,--start-group @hello.rsp  -Wl,--end-group
    

    该命令可以查看所有编译目标的详细编译命令,可以看出,首先编译出了libhello_static.hello_static.o、libhello_shared.hello_shared.o、hello.hello.o三个目标文件,并将目标文件放在obj文件夹下,最后链接成hello的可执行程序。

  • ninja -t deps

    obj/libhello_static.hello_static.o: #deps 2, deps mtime 1681441611760382343 (VALID)
        ../hello_static.cc
        ../hello_static.h
    
    obj/libhello_shared.hello_shared.o: #deps 2, deps mtime 1681441611760382343 (VALID)
        ../hello_shared.cc
        ../hello_shared.h
    
    obj/hello.hello.o: #deps 3, deps mtime 1681441611768382257 (VALID)
        ../hello.cc
        ../hello_shared.h
        ../hello_static.h
    

    查看目标的依赖关系,如obj/libhello_static.hello_static.o目标文件依赖了../hello_static.cc源文件和../hello_static.h头文件。

  • ninja -t targets all

    build.ninja: gn
    obj/hello.hello.o: cxx
    hello: link
    obj/libhello_shared.hello_shared.o: cxx
    libhello_shared.so: solink
    obj/libhello_static.hello_static.o: cxx
    obj/libhello_static.a: alink
    hello_shared: phony
    hello_static: phony
    :hello: phony
    :hello_shared: phony
    :hello_static: phony
    all: phony
    

    列出ninja阶段的所有编译目标以及编译使用的工具。

  • ninja -t commands hello

    g++ -MMD -MF obj/hello.hello.o.d   -fPIC -pthread  -c ../hello.cc -o obj/hello.hello.o
    g++ -MMD -MF obj/libhello_shared.hello_shared.o.d -DHELLO_SHARED_IMPLEMENTATION  -fPIC -pthread  -c ../hello_shared.cc -o obj/libhello_shared.hello_shared.o
    g++ -shared  -o ./libhello_shared.so -Wl,-soname=libhello_shared.so @libhello_shared.so.rsp
    g++ -MMD -MF obj/libhello_static.hello_static.o.d   -fPIC -pthread  -c ../hello_static.cc -o obj/libhello_static.hello_static.o
    rm -f obj/libhello_static.a && ar rcs obj/libhello_static.a obj/libhello_static.hello_static.o
    g++ -Wl,-rpath=\$ORIGIN/ -Wl,-rpath-link= -o hello -Wl,--start-group @hello.rsp  -Wl,--end-group
    

    查看编译单个目标的详细编译命令。

第一个hello world

进入out目录,运行hello

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

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

相关文章

【应用开发一】LED开发

文章目录 1应用层控制外设的两种方式2 sysfs和/sys关系3 LED控制方式3.1 基本情况3.2 LED属性文件介绍3.3 命令行属性测试3.4 led程序3.5 开发板上测试 1应用层控制外设的两种方式 使用设备文件控制 在Linux系统下,一切皆是文件。应用层控制底层硬件同样也是通过文…

堆的实现详解

目录 1. 堆的概念和特点2. 堆的实现2.1 堆向下调整算法2.2堆的创建2.3 建堆时间复杂度2.4 堆的插入2.5 堆的删除2.6 堆的代码实现2.6.1 结构体2.6.2 初始化2.6.3 销毁2.6.4 插入2.6.5 删除2.6.6 获取堆顶2.6.7 判空2.6.8 个数2.6.9 向上调整2.6.10 向下调整3. 堆的实现测试测试…

SQL连接与筛选:解析left join on和where的区别及典型案例分析

文章目录 前言一、left join on和where条件的定义和作用left join on条件where条件 二、left join on和where条件的区别原理不同left join原理:where原理: 应用场景不同执行顺序不同(作用阶段不同)结果集不同 三、实际案例理解lef…

深入JVM:详解JIT即时编译器

文章目录 深入JVM:详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析(1)同步锁消除(…

高考填报志愿,找准自己的真兴趣来选择专业

又是一年一度的高考填报志愿的时间了,毕业生们要根据自己的分数,在很短的时间内确定自己的专业。专业千万条,兴趣第一条。专业的选择很大程度上决定着大学的学习生活是否顺利,甚至决定着以后的职业生涯。在纷繁复杂的专业中&#…

全球首个数字人开源了

DUIX(Dialogue User Interface System)是硅基智能打造的AI数字人智能交互平台。通过将数字人交互能力开源,开发者可自行接入多方大模型、语音识别(ASR)、语音合成(TTS)能力,实现数字…

【AI落地应用实战】如何高效检索与阅读论文——302.AI学术论文工具评测

一、引言 作为一名学术领域的探索者,我们都知道,检索和阅读论文是我们获取知识、启发思考、验证假设的基石,也是日常学习中必不可少的基本功之一。然而在浩瀚的学术海洋中,如何快速、准确地找到我们需要的论文,就像是…

git提交新仓库代码,提示无权限,但用户名已修改

目录 1 用户名无权限 2 删除用户凭据 2.1 打开控制面板 2.2 找到“凭据管理器” 2.3 删除git历史 3 npm工具库添加git仓库指引 1 用户名无权限 之前因为时间的原因,js-tool-big-box工具库没有提交到github上去,今天想着往上提交一下,但…

python03——文件操作(new)

“变量”open(‘文件路径’,‘模式’) //注意加引号 “变量”.write( ) //write函数是写的是字符串,如果你写的东西不是字符串,要写成write(str(。。)) “变量”.read…

【Containerd】Containerd接入Harbor仓库

说明 在日常使用容器时,安全方便起见一般都会使用到私有仓库,一般都是采用 harbor 作为私有仓库,docker 对接 harbor 仓库非常简单,那么 containerd 如何对接 harbor 呢? 在内网使用 harbor 根据个人习惯&#xff0c…

快速上手golang(持续更新)

由于项目需要,我不得不快速掌握go语言来帮助我进行项目的开发。时间紧迫到我来不及去了解语言的特性就直接项目上手了。我决定就先熟悉一个主流的go框架和go语言的一些日常用法,之后就得滑着这只破船摇摇晃晃上路了。 1 基础命令 就说几个用的多的&…

QT拖放事件之八:通过全局剪切板中的接口QClipboard::mimeData()来获取MIME类型数据

1、演示效果 首先向剪切板写入数据,然后点击paste按钮进行从全局剪切板中 获取 MIME数据。。。 2、核心代码 void Widget::on_pasteBtn_clicked() {const QClipboard* clipBoard = QGuiApplication::clipboard()

理解和处理不同类型的上下文的新型的语言模型ReALM

在人类的日常交流中,模糊的代词如“他们”或“那个”常常出现,它们的意义通常依赖于上下文才能明确。这种上下文的理解对于对话助手来说至关重要,因为它们旨在提供一种自然的交流体验。然而,现有的对话助手在处理这类模糊引用时往…

Java HashMap 简介

HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是线程不安全的。 HashMap;可以存储 null 的 key 和 value ,但 null 作为 key 只能有一个,null 作为值可以…

非强化学习的对齐方法

在文章《LLM对齐“3H原则”》和《深入理解RLHF技术》中,我们介绍了大语言模型与人类对齐的“3H原则”,以及基于人类反馈的强化学习方法(RLHF),本文将继续介绍另外一种非强化学习的对齐方法:直接偏好优化&am…

深度学习语义分割算法之基础知识

文章目录 前言一、图像分割介绍1.语义分割2.实例分割3.全景分割 二、常见数据集格式1.PASCAL VOC2.MS COCO 三、语义分割结果四、语义分割常见评价指标1.Pixel Accuracy2.mean Accuracy3.mean IoU 五、语义分割标注工具结束语 💂 个人主页:风间琉璃🤟 版…

FireFox 编译指南2024 Windows10篇-环境准备(一)

1. 引言 在开源浏览器项目中,Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox,开发者需要做好充分的环境准备工作。这不仅是编译成功的基础,也是后续调试、优化和二次开发的关键步骤。 编译Firefox是一个复…

硬核实力再亮,玩出梦想科技发布全球首款安卓系统空间计算机

6月25日,玩出梦想科技在新加坡召开全球新品发布会,正式发布全球首款安卓系统空间计算机——玩出梦想MR,填补了空间计算机在安卓生态的空白。 作为品牌沉淀两年的破晓之作,玩出梦想MR以业内领先软硬件配置,强大自研算法…

kafka--发布-订阅消息系统

1. Kafka概述 1. kafka是什么 kafka是分布式的、高并发的、基于发布/订阅模式的消息队列软件系统。 kafka中的重要组件 Producer:消息生产者,发布消息到Kafka集群的终端或服务Consume:消费者,从Kafka集群中消费消息的终端或服…

CAN报文的发送类型-OnChange、OnWrite、IfActive、Repetition

CAN报文的发送类型分为基本发送类型和混合发送类型两大类 CAN基本发送类型包括Cyclic周期发送、OnChange变化时发送、OnWrite写入时发送和IfActive有效时发送。基本发送类型中的Cyclic称为周期型,而其他3个类型称为事件型(Event)。发送次数是通过定义Repetition重复次数来实…