Bazel构建简单的C++程序
目录结构如下
实现简单的两个数相加,主函数输出两个数的和
├── libs
│ ├── add.cc
│ ├── add.h
│ └── BUILD
├── main
│ ├── BUILD
│ └── main.cc
└── WORKSPACE
文件说明
- WORKSPACE :表明此文件所在的路径为项目的根,其它项目均可以以此根节点访问
main/BUILD
:主函数的构建规则main/main.cc
:主函数源代码libs/add.cc
:库函数实现libs/add.h
:库函数头文件libs/BUILD
:库函数的编译规则
其中,main.cc
如下:
#include "add.h"
#include <iostream>
using namespace std;
int main(){
int a = 10,b = 20;
cout<<add(a,b)<<endl;
}
库函数add.cc
实现:
#include "add.h"
int add(int a,int b){
return a+b;
}
库函数头文件add.h
#pragma once
int add(int a,int b);
libs/BUILD
:构建规则
cc_library(
name = "addlib",# 此BUILD文件负责的任务的名称,这里主要为了编译库
srcs = ["add.cc"],# 编译库需要的源文件
hdrs = ["add.h"], # 编译库需要的头文件
visibility=["//main:__pkg__"], # 编译库的任务名称需要对main目录可见,其才可以在BUILD中直接使用
)
main/BUILD
:
cc_binary(
name = "main", # 此BUILD任务负责构建可执行文件,这里任务名称设置为main
srcs = ["main.cc"],# 此任务构建需要的源代码
deps = [
"//libs:addlib",# 因为需要link库addlib,这里需要设置依赖,还需要在构建addlib的文件中设置visibility
],
copts = ["-Ilibs"]# 设置头文件搜索路径,否则提示找不到add.h
)
编译构建代码:
bazel build //main:main
输出如下:
Auto-Configuration Warning: CC with -fuse-ld=gold returned 0, but its -v output didn't contain 'gold', falling back to the default linker.
INFO: Analyzed target //main:main (1 packages loaded, 4 targets configured).
INFO: Found 1 target...
Target //main:main up-to-date:
bazel-bin/main/main
INFO: Elapsed time: 0.060s, Critical Path: 0.01s
INFO: 1 process: 1 internal.
执行编译后的二进制文件:
bazel-bin/main/main
生成依赖关系
bazel query --notool_deps --noimplicit_deps "deps(//main:main)" \
--output graph
输出如下:
DEBUG: /home/xxx/.cache/bazel/_bazel_liushuai/d9597acfdfdfac150b8fe6c31c69a265/external/bazel_tools/tools/cpp/lib_cc_configure.bzl:118:10:
Auto-Configuration Warning: CC with -fuse-ld=gold returned 0, but its -v output didn't contain 'gold', falling back to the default linker.
digraph mygraph {
node [shape=box];
"//main:main"
"//main:main" -> "//main:main.cc"
"//main:main" -> "//libs:addlib"
"//main:main.cc"
"//libs:addlib"
"//libs:addlib" -> "//libs:add.cc\n//libs:add.h"
"//libs:add.cc\n//libs:add.h"
}
xdot绘制依赖关系图:sudo pacman -S xdot
xdot <(bazel query --notool_deps --noimplicit_deps "deps(//main:main)" \ --output graph)