[C++] 构建工具 Bazel 简单使用笔记
Bazel 是由 Google 开源的一款构建工具,支持 C++ 等多种语言
我个人是不喜欢 CMake 或者 GNU Make 的,感觉语法太丑了(?)
最近看了几个项目用的都是 Bazel,看起来语法似乎还行?对我 xp
于是打算简单学一下,记录一点常见用法以后好抄
安装
对 Windows 系统,直接按照官网方法下载即可,也可以去 Github 上下载二进制文件自己配置环境变量。
如果在 VSCode 中使用了 Bazel 插件,似乎还要另外下载 buildtools
文件结构
想要使用 Bazel,只需在项目的根目录下新建一个 WORKSPACE 文件即可。
在项目中在不同地方会有一个或多个 BUILD 文件,用于表示项目的不同模块。
一个例子:
1 | > project |
然后在 BUILD 文件中写上相应的配置:
1 | cc_binary( |
最后在根目录运行 bazel build //src:main 即可编译,这里 // 指根目录
编译后可以看到二进制文件生成的位置。
语法
-
cc_library声明一个库,参数:
name: 名字srcs:cpp源文件hdrs: 头文件
-
cc_binary声明一个二进制编译入口,参数:
name: 名字srcs: 源文件deps: 依赖
一个直观的例子:
1 | cc_library( |
于是 lib.h 中声明,lib.cpp 中实现,即可在 main.cpp 中直接 #include "lib.h"
一些其他的语法:
-
glob包含多个文件,如
srcs = glob(["*.h"]) -
包含路径
为了避免在包含文件时使用绝对路径的麻烦,可以使用
copts指定包含路径(类似 gcc 的-I参数),如根目录下的文件src/a/include/lib.h:1
2hdrs = ["include/lib.h"]
copts = ["-Isrc/a/include"] -
引入外部依赖
在
WORKSPACE中添加:1
2
3
4
5
6
7
8load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "gtest",
url = "https://github.com/google/googletest/archive/release-1.10.0.zip",
sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91",
build_file = "@//:gtest.BUILD",
)然后新建
gtest.BUILD针对此项目进行设置(若外部依赖自带BUILD文件则不需要build_file)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17cc_library(
name = "main",
srcs = glob(
["googletest-release-1.10.0/src/*.cc"],
exclude = ["googletest-release-1.10.0/src/gtest-all.cc"]
),
hdrs = glob([
"googletest-release-1.10.0/include/**/*.h",
"googletest-release-1.10.0/src/*.h"
]),
copts = [
"-Iexternal/gtest/googletest-release-1.10.0/include",
"-Iexternal/gtest/googletest-release-1.10.0"
],
linkopts = ["-pthread"],
visibility = ["//visibility:public"],
)可以通过
strip_prefix = "googletest-release-1.10.0"移除http_archive的前缀以简化设置,变为1
2
3
4
5
6
7
8
9
10
11
12
13
14cc_library(
name = "main",
srcs = glob(
["src/*.cc"],
exclude = ["src/gtest-all.cc"]
),
hdrs = glob([
"include/**/*.h",
"src/*.h"
]),
copts = ["-Iexternal/gtest/include"],
linkopts = ["-pthread"],
visibility = ["//visibility:public"],
)一些相关的语法:
-
linkopts: 编译选项,linkopts = ["-pthread"] -
visibility = ["//visibility:public"]: 设置允许不同文件夹下的项目引用(默认只有同一文件夹的BUILD文件可以引用)
之后即可在其他
BUILD文件的deps中添加"@gtest//:main" -






