bazel构建C++项目
bazel项目
使用bazel构建C++项目,bazel项目的工程目录下必须包含一个WORKSPACE的空文件,其存在表示了项目的根目录所在。BUILD文件包含了构建规则。
常见的bazel+c++项目的文件结构:
.
├── add.cc
├── add.h
├── BUILD
├── main.cc
└── WORKSPACE
构建简单的bazel项目
构建helloworld项目:
- hello.cc文件如下:
#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
- BUILD文件如下:
cc_library(
name = "test",
srcs = ["hello.cc"],
)
- name:工程的名字
- srcs:项目的源代码
- 构建
bazel build //:test
//:
构建项目所在的根目录(WORKSPACE所在目录),test为上面的cc_library指定的名称,输出如下:
INFO: Invocation ID: 4292b15c-ac1c-49d4-9a29-cbeea8cb2852
INFO: Analysed target //:test (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //:test up-to-date:
bazel-bin/libtest.a
bazel-bin/libtest.so
INFO: Elapsed time: 0.062s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
输出文件存放在工程目录下的bazel-bin
目录下。
构建包含头文件的工程
工程目录如下:
.
├── add.cc
├── add.h
├── BUILD
├── main.cc
└── WORKSPACE
add.cc文件:
#include "add.h"
int add(int a,int b)
{
return a+b;
}
头文件add.h:
#ifndef ADD_H_
#define ADD_H_
int add(int a,int b);
#endif
main.cc文件:
#include <iostream>
#include "add.h"
int main()
{
int a,b;
std::cin>>a>>b;
std::cout<<a<<"+"<<b<<" = "<<add(a,b);
return 0;
}
构建文件:
cc_library(
name = "add",
srcs = ["add.cc"],
hdrs = ["add.h"],
)
cc_binary(
name = "math",
srcs = ["main.cc"],
deps = [
":add"
]
)
解释:
- cc_library(name):库文件名称
- cc_library(srcs):库文件的源文件
- cc_library(hdrs):库文件的头文件
- cc_binary(name):工程的名称
- cc_binary(srcs):工程主代码
- cc_binary(deps):依赖的库
构建代码:
bazel build //:math
查看依赖图:
xdot <(bazel query --nohost_deps --noimplicit_deps 'deps(//:math)' \
--output graph)
依赖图如下:
源代码下载