Bazel

news2025/1/11 14:48:42

简介:
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.编译和运行
在这里插入图片描述

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

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

相关文章

【遥感专题系列】影像信息提取之——面向对象的影像分类技术

“同物异谱&#xff0c;同谱异物”会对影像分类产生的影响&#xff0c;加上高分辨率影像的光谱信息不是很丰富&#xff0c;还有经常伴有光谱相互影响的现象&#xff0c;这对基于像素的分类方法提出了一种挑战&#xff0c;面向对象的影像分类技术可以一定程度减少上述影响。 本…

git 删除 submodule 子模块的步骤

实验有效&#xff0c;这里删除了两个 submodule。 1, 执行删除 submodule mkdir tmp1 && cd tmp1 && git clone --recursive ssh://gitaaa.bbb.ccc.git \ && cd ccc/ && git checkout -b abranch_01 \ && git submodule deinit -f…

初识物联网

1&#xff1a;什么是IOT&#xff1a; 物联网的英文名称是Internet of Things。IoT则是Internet of Things的缩写。因此, 物联网 IoT。 通俗地说&#xff0c;物联网是互联网的一种拓展。我们知道互联网是由无数的计算机和智能手机交错连接而编织成的一张网。而正是有了像NodeM…

半监督学习 - 三元组学习(Triplet Learning)

什么是机器学习 三元组学习&#xff08;Triplet Learning&#xff09;是半监督学习中一种用于学习有用表示的方法。它通常用于学习数据中的相似性关系&#xff0c;尤其在人脸识别、图像检索等领域中得到广泛应用。三元组学习是通过构造三元组&#xff08;triplet&#xff09;来…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城 免 费 搭 建

鸿鹄云商 B2B2C产品概述 【B2B2C平台】&#xff0c;以传统电商行业为基石&#xff0c;鸿鹄云商支持“商家入驻平台自营”多运营模式&#xff0c;积极打造“全新市场&#xff0c;全新 模式”企业级B2B2C电商平台&#xff0c;致力干助力各行/互联网创业腾飞并获取更多的收益。从消…

【云原生】springboot 整合 OpenTelemetry

目录 一、前言 二、应用可观测性概述 2.1 什么是可观测性 2.2 可观测性三大指标 2.2.1 指标&#xff08;Metrics&#xff09; 2.2.2 日志&#xff08;log&#xff09; 2.2.3 追踪(Traces) 三、OpenTelemetry 介绍 3.1 什么是OpenTelemetry 3.2 OpenTelemetry架构和组件…

༺༽༾ཊ—设计-七个原则-模式—ཏ༿༼༻

第一原则&#xff1a;单一职责 一个类只负责一个功能领域中的相应职责&#xff1b; 接下来我们举一个代码例子&#xff0c;主要的功能实现是&#xff1a; 在主函数中运行调用描边工具和填充工具画矩形与圆形 首先写一个圆形类&#xff0c;里面只有一个方法用来返回string类型…

SpringCloud 源码系列之全局 Fegin 日志收集(okHttpClient、httpClient)

SpringCloud 源码系列之全局 Fegin 日志收集&#xff08;okHttpClient、httpClient&#xff09;目录 HttpClient 全局日志收集思路切换成HttpClient验证配置效果HttpClient 全局日志收集源码分析看源码顺带产物okHttpClient 全局日志收集总结 接上文SpringCloud OpenFegin 底层…

使用Python+pygame实现贪吃蛇小游戏

使用Pythonpygame贪吃蛇小游戏 使用第三方库pygame&#xff0c;关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 给出两种实现。 第一种 运行效果如下&#xff1a; 游戏源码如下&#xff1a; import pygame import sy…

中国互联网的早期形态

1 大约是从 1991 年开始&#xff0c;国内开始了第一个 BBS 站——北京长城站&#xff0c;经过长时间发展&#xff0c;直到 1995 年&#xff0c;随着计算机及其外设的大幅降价&#xff0c;BBS 才逐渐被部分人们所认识。少数玩 BBS 站的“极客”站长&#xff0c; 基于个人关系&am…

Linux搭建和使用redis

官网地址&#xff1a;http://redis.io/download 文件上传到服务器 tar包解压 tar zxvf redis-5.0.14.tar.gz安装 进入解压目录下&#xff0c;找到Makefile所在目录&#xff0c;执行make命令 make执行之后&#xff0c;会产生src等目录&#xff0c;进入执行make install命令…

23111 网络编程 day2

思维导图 重打代码 #include<myhead.h> #define SER_IP "192.168.122.150" //服务器ip #define SER_PORT 8888 //服务器端口int main(int argc, const char *argv[]) {//1.创建用于连接的套接字int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("…

【图形学】探秘图形学奥秘:区域填充的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《图形学 | 图像解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1. 初识模式识别 …

Python - 深夜数据结构与算法之 位运算

目录 一.引言 二.位运算简介 1.二进制与十进制 2.左/右移 3.位运算 4.异或 XOR 5.指定位置的位运算 6.实战要点 三.经典算法实战 1.Number-1-of-bits [191] 2.Power-Of-Two [231] 3.Reverse-2-Bits [190] 4.N-Queens [51] 四.总结 一.引言 通常情况下我们计数采…

Java SE入门及基础(14)

二重循环 1. 什么是二重循环 二重循环就是一个循环结构中又包含另外一个循环结构 while ( 外层循环条件 ){ //外层循环操作 while ( 内层循环条件 ){ //内层循环操作 } //外层循环操作 } while ( 外层循环条件 ){ //外层循环操作 for ( 循环变量初始化 ; 内层循环条…

模拟瑞幸小程序购物车

是根据渡一袁老师的大师课写的&#xff0c;如有什么地方存在问题&#xff0c;还请大家指出来哟ど⁰̷̴͈꒨⁰̷̴͈う♡&#xff5e; index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-e…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (二)

论文阅读笔记AI篇 —— Transformer模型理论实战&#xff08;二&#xff09; 第二遍阅读&#xff08;通读&#xff09;2.1 Background2.2 Model Architecture2.2.1 Encoder and Decoder Stacks2.2.2 Scaled Dot-Product Attention2.2.3 Multi-Head Attention 2.3 Why Self-Atte…

python 元组的详细用法

当前版本&#xff1a; Python 3.8.4 文章目录如下 1. 介绍元组 2. 定义元组 3. 访问元组 4. 查询元组 1. 介绍元组 元组&#xff08;Tuple&#xff09;是一个有序的、不可变的数据序列。它可以包含各种类型的数据&#xff0c;例如数字、字符串、列表等。元组使用圆括号()来…

机器人制作开源方案 | 红外热成像巡检小车

作者&#xff1a;马跃宁、赵婷婷、牟金晶、邢艳慧、隋鹏飞 单位&#xff1a;哈尔滨剑桥学院 指导老师&#xff1a;韩轶男、齐丹丹 1. 项目简介 1.1 项目背景 21世纪以来&#xff0c;随着我国先进水平不断提高&#xff0c;家家户户用电也是我们必不可少的一部分&#xff0c;…

Tuxera2024版本正式上线!(免费mac读写磁盘工具)

当您获得一台新 Mac 时&#xff0c;它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac&#xff0c;您需要一个附加的 NTFS 驱动程序。Tuxera 的 Microsoft NTFS for Mac 是一款易于使用的软件&#xff0c;可以在 Mac 上打开、编辑、复制、移动或删…