Bazel

简介:
Bazel 是 google 研发的一款开源构建和测试工具,也是一种简单、易读的构建工具。
Bazel 支持多种编程语言的项目,并针对多个平台构建输出。

高级构建语言:Bazel 使用一种抽象的、人类可读的语言在高语义级别上描述项目的构建属性。与其他工具不同,Bazel 在库、二进制文件、脚本和数据集的概念上运行,免于编写对编译器和链接器等工具的单独调用的复杂性。
Bazel 既快速又可靠:Bazel 会缓存之前完成的所有工作,并跟踪对文件内容和构建命令所做的更改。这样,Bazel就能知道何时需要重新构建某些内容,并且仅重新构建。如需进一步加快构建速度,可以将项目设置为以高度并行且增量的方式进行构建。
Bazel 是多平台应用:Bazel可在 Linux、macOS 和 Windows 上运行。Bazel 可以在同一个项目中为多个平台(包括桌面设备、服务器和移动设备)构建二进制文件和可部署软件包。
Bazel 可以扩缩。在处理具有 10 万多个源文件的 build 时,Bazel 能够保持敏捷性。它可与数以万计的代码库和用户群进行协作。
Bazel 是可扩展的。支持许多语言,您、可以扩展 Bazel 以支持任何其他语言或框架。

Bazel 基本使用流程

在 Aoollo 的 docker 容器中已经安装了 Bazel,所以直接使用即可,Bazel的使用比较简单,大致流程下:
1.新建project目录,project 目录下新建文件 WORKSPACE;
2.新建包,在包下新建 BUILD 文件;
3.包中编写源文件;
4.编辑BUILD文件;
5.编译;
6.执行。
准备工作:在 /apollo/cyber 目录下新建 demo_base_bazel 目录,后续关于 bazel 实现都存储在该目录中。

C++实现

1.新建project目录
在demo_base_bazel 目录下新建目录 pro1_helloworld,再在 pro1_helloworld 目录下新建 WORKSPACE 文件。
2.新建包目录
在 pro1_helloworld 目录下新建 demo_pkg 目录,该目录下新建 BUILD 文件。
3.新建源文件
在 demo_pkg 目录下新建 C++ 源文件 hello_world.cc,编写内容如下:

/*
    输出 hello bazel
*/
# include<iostream>

using namespace  std;

int main(int argc, char const *argv[])
{
    /* code */
    cout<<"hello bazel"<<endl;
    return 0;
}

在 demo_pkg 目录下新建文件 BUILD,编写内容如下:

cc_binary(
    name="hello",
    srcs=["hello_world.cc"],
)

name:可执行文件;
srcs:源文件
4.保存后,到达 pro01_helloworld 目录下,执行:

bazel build demo_pkg/...

如果在 pro01_helloworld 下有多个文件,可以使用下面的指令指定编译文件:

bazel build demo_pkg:指定文件名(为BUILD文件中的name)

5.在 pro01_helloworld 目录下的 bazel-bin/demo_pkg 下找到 hello 文件,执行:

./bazel-bin/demo_pkg/hello

也可以使用:

bazel run demo_pkg:hello

这条指令同时进行编译和执行,可以不先编译直接进行使用。

在这里插入图片描述

在这里插入图片描述

python 实现与C++步骤相同,唯一不同就是这里是 py_binary,且name与src一致:

// BUILD
py_binary(
    name="hello_world_py",
    srcs=["hello_world_py.py"],
)
#hello_world_py.py
#!usr/bin/env python3
if __name__ == "__main__":
    print("hello bazel(python)")

在这里插入图片描述

Bazel 使用的库依赖

编写被依赖库实现

首先需要实现被依赖的库的相关文件。
1.新建project目录
在demo_base_bazel目录下新建目录pro2_lib,再在pro2_lib目录下新建WORKSPACE文件。
⒉新建包目录
在pro2_lib目录下新建demo_lib目录,该目录下新建BUILD文件。
3.新建头文件与源文件
在demo_lib目录下新建c++头文件 hello_great.h,编写内容如下:

#ifndef LIB_HELLO_GREAT_H
#define LIB_HELLO_FREAT_H
#include <string>
std :: string get_great(const std :: string& name);
#endif

在 demo_lib 目录下新建C++ 头文件hello_great.cc,编写内容如下:

#include "hello_great.h"

std :: string get_great( const std :: string&  name){
    return "hello " + name;
}

4.编辑BUILD文件
内容如下:

cc_library(
    name="hello_great_lib",
    srcs=["hello_great.cc"],
    hdrs=["hello_great.h"],
)

name 库文件
srcs 源文件
hdrs 头文件
5.进行编译

bazel build demo_lib/...
//或
bazel build demo_lib:hello_world_great

在这里插入图片描述

同包下的库依赖

在这里插入图片描述
1.编写C++源文件
承上,在 demo_lib 目录中新建 hello_world.cc,需要包含 hello_great.h 并调用头文件中的 get_great 函数,内容如下:

#include <iostream>
#include "hello_great.h"
using namespace std;
int main(int argc,char const *argv[]){
	cout<<get_great("bazel lib")<<endl;
	return 0;
}

2.编辑BUILD文件

cc_binary(
	name="hello_world",
	srcs=["hello_world.cc"],
	deps=[":hello_great_lib"]
)

deps:依赖项

3.编译
在这里插入图片描述
4.执行
在这里插入图片描述

跨包库依赖

在这里插入图片描述

1.新建包
基于上面的,在pro2_lib下新建包: demo_main,包下新建BUILD文件。
⒉.新建C++源文件
在包 demo_main 中新建hello_world.cc 文件,需要包含 hello_great.h 并调用头文件中的 get_great 函数,内容如下:

#include <iostream>
#include "demo_lib/hello_great.h"
using namespace std;
int main(int argc,char const *argv[])
	cout << get_great( "bazel lib") << endl;
	return 0;
}

3.编辑BUILD文件
BUILD文件内容如下:

cc_binary(
	name = "hello_world",
	srcs = ["hello_world.cc"],
	deps = ["//demo_lib:hello_great_lib"],

另外,还需要为 demo_lib 包添加可访问权限,否则会导致编译失败,修改 demo_lib/BUILD 文件。

方式1:在demo_lib/BUILD文件中添加函数:

package(default_visibility = [" //visibility : public"])

方式2:修改cc_library函数内容如下:

cc_library(
	name = "hello_great_lib",
	srcs = ["hello_great.cc"],
	hdrs = [ "hello_great.h"],
	visibility = ["//demo_main:__pkg__"]
)

visibility 设置可见度(权限)

4.编译和运行
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库结构文档生成方法二(EZDML)

EZDML 下载链接&#xff1a;EZDML - 下载 我们常用的是数据建模有PowerDesigner,EZDML也是一款数据建模工具&#xff0c;而且功能很多&#xff0c;除了生成sql&#xff0c;还可以生成前端后端代码等等。 我们直接下载最新版后点击安装&#xff0c;打开后会默认打开示例&#…

计划——不做计划

今天想讲一下我做计划这件事。 2024 年已经过了两个星期了&#xff0c;毕竟自己也到了一个新的阶段&#xff0c;想着也可以搞个计划&#xff0c;写写自己未来一年计划做的事情。 但回忆了过去这半年来我所做的计划&#xff0c;我的双手抚摸着键盘&#xff0c;迟迟动不了手。 …

Linux网络编程---IP 地址格式转换函数

Linux网络编程—IP 地址格式转换函数 我们更容易阅读的IP地址是以点分十进制表示的&#xff0c;例如&#xff1a;192.168.5.10 &#xff0c;这是一种字符串的形式&#xff0c;但是计算器所需要的IP地址是以二进制进行表示&#xff0c;这便需要我们在点分十进制字符串和二进制地…

Jmeter 测试脚本录制器-HTTP 代理服务器

Jmeter 测试脚本录制器-HTTP 代理服务器 Jmeter 配置代理服务器代理服务器获取请求地址示例图配置步骤 浏览器配置代理Google 浏览器插件配置代理windows 本地网络配置代理 启动录制&#xff0c;生成证书生成证书导入证书Jmeter 配置证书 浏览器点击页面&#xff0c;录制请求地…

基于Springboot的善筹网(众筹网-有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的善筹网(众筹网-有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring S…

5 - 声明式事务

传统事务流程&#xff1a; Connection connection JdbcUtils.getConnection(); try {//1. 先设置事务不要自动提交connection.setAutoCommit(false);//2. 进行各种 crud//多个表的修改&#xff0c;添加 &#xff0c;删除select from 商品表 > 获取价格//修改用户余额updat…

Jetbrains ai assistant激活后仍无法使用,怎么回事?

用正式的ai assistant激活码激活后仍然无法使用 首先获取了ai assistant激活码&#xff0c;激活后如下 地址&#xff1a;https://web.52shizhan.cn 上图是已经激活成功了&#xff0c;但是在右侧这里打开ai assistant不可用 点击开始使用ai assistant 出错 以上是用了ai as…

排序——归并排序

文章目录 基本思想递归版本思路代码实现 非递归版思路代码实现 特性结果演示 基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子…

智能合约介绍

莫道儒冠误此生&#xff0c;从来诗书不负人 目录 一、什么是区块链智能合约? 二、智能合约的发展背景 三、智能合约的优势 四、智能合约的劣势 五、一些关于智能合约的应用 总结 一、什么是区块链智能合约? 智能合约&#xff0c;是一段写在区块链上的代码&#xff0c;一…

HNU-算法设计与分析-实验2

算法设计与分析实验2 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验21 用动态规划法实现0-1背包问题重述想法代码验证算法分析 2 用贪心算法求解背包问题问题重述想法代码验证算法分析 3 半数集问题&#xff08;实现题2-3&#xff09;问题重述…

【详解】Java集合框架

文章目录 集合1、Collection1.1、List1.2、Queue & Deque1.2.1、Stack 1.3、Set 集合 Java 集合&#xff0c;也称为容器&#xff0c;主要由两大接口&#xff08;Interface&#xff09;派生出来的&#xff0c;Collection 和 Map Collection 用来存放单一元素&#xff08;单…

非线性最小二乘问题的数值方法 —— 从高斯-牛顿法到列文伯格-马夸尔特法 (II, Python 简单实例)

Title: 非线性最小二乘问题的数值方法 —— 从高斯-牛顿法到列文伯格-马夸尔特法 (II, Python 简单实例) 姊妹博文 非线性最小二乘问题的数值方法 —— 从高斯-牛顿法到列文伯格-马夸尔特法 (I) 文章目录 0.前言1. 最优问题实例2. 列文伯格-马夸尔特法 (Levenberg-Marquardt Me…

Mindspore 公开课 - CodeGeeX

CodeGeeX: 多语言代码生成模型 CodeGeeX 是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现&#xff0c;在鹏城实验室“鹏城云脑II”中的192个节点&#xff08;共1536个国产昇腾910 AI处理器&#xff09;上训练而成。截至2022年6月22日&…

非常好用的Mac清理工具CleanMyMac X 4.14.7 如何取消您对CleanMyMac X的年度订购

CleanMyMac X 4.14.7是Mac平台上的一款非常著名同时非常好用的Mac清理工具。全方位扫描您的Mac系统&#xff0c;让垃圾无处藏身&#xff0c;您只需要轻松单击2次鼠标左键即可清理数G的垃圾&#xff0c;就这么简单。瞬间提升您Mac速度。 CleanMyMac X 4.14.7下载地址&#xff1a…

WEB 3D技术 three.js 3D贺卡(1) 搭建基本项目环境

好 今天 我也是在网上学的 带着大家一起来做个3D贺卡 首先 我们要创建一个vue3的项目、 先创建一个文件夹 装我们的项目 终端执行 vue create 项目名称 例如 我的名字想叫 greetingCards 就是 vue create greetingcards因为这个名录 里面是全部都小写的 然后 下面选择 vue3 …

CSS实现平行四边形

1、为什么实现平行四边形 在日常开发过程中&#xff0c;有些时候我们可以会遇到一种情况&#xff0c;如可视化大屏中要求我们横线实现对应的进度条&#xff0c;但进度条的内容是由无数个平行四边形组装类似于进度条的形式&#xff0c;那么我们就需要使用CSS来进行对应的实现。 …

Python: vars()详细解释

vars() 是一个内置函数&#xff0c;用于返回一个对象的 __dict__ 属性。它接受一个对象作为参数&#xff0c;如果省略参数&#xff0c;它返回当前局部作用域的字典。 具体而言&#xff0c;vars() 的行为取决于参数的类型&#xff1a; 1. 没有参数&#xff1a; 如果没有提供参…

【MATLAB】EEMD+FFT+HHT组合算法

代码原理 EEMD&#xff08;经验模态分解&#xff09;FFT&#xff08;快速傅里叶变换&#xff09;HHT&#xff08;希尔伯特-黄变换&#xff09;组合算法是一种常用的信号处理和分析方法。这个组合算法包含了EEMD、FFT和HHT三个步骤&#xff0c;可以用于处理非线性和非平稳信号。…

【网络取证篇】Windows终端无法使用ping命令解决方法

【网络取证篇】Windows终端无法使用ping命令解决方法 以Ping命令为例&#xff0c;最近遇到ping命令无法使用的情况&#xff0c;很多情况都是操作系统"环境变量"被改变或没有正确配置导致—【蘇小沐】 目录 1、实验环境&#xff08;一&#xff09;无法ping命令 &a…