bazel 简单使用

Bazel是google开发的一个开源编译工具,类似与makefile的功能。Bazel支持多种语言的项目(比如C/C++ /Python),并为多种平台构建输出。Bazel支持跨多个存储库的大型代码库以及大量用户。

Bazel的安装

官方文档就是个很好的介绍https://docs.bazel.build/versions/1.2.0/install.html

比如在ubuntu上的安装过程如下截图 ( https://docs.bazel.build/versions/1.2.0/install-ubuntu.html )

Bazel  github路径  https://github.com/bazelbuild/bazel/releases

 

Bazel的工作方式

  1. 加载BUILD与目标有关的文件。
  2. 分析输入及其 依赖项,应用指定的构建规则,并生成操作 图。
  3. 在输入上执行构建操作,直到产生最终的构建输出为止。​​​​

简单使用

Bazel 编译主要需要BUILD WORKSPACE两个文件。

bazel在编译时,主要依赖BUILD文件,下面为一个例子:

首先我们新建立一个文件夹 test mkdir test

然后创建一个空的文件,叫做WORKSPACE vi WORKSPACE),bazel编译需要依靠此文件划出工作区域,  bazel指令只能在含有workspace文件的目录下运行。复杂项目在workspace文件中,可能需要添加外部依赖(external dependence)比如gitlab去下载依赖包。

创建一个hello.cc

扫描二维码关注公众号,回复: 12880338 查看本文章

#include <ctime>

#include <string>

#include <iostream>

 

std::string get_greet(const std::string& who){

    return "Hello " + who;

}

 

int main(){

    std::string who = "world";

    std::cout<<get_greet(who) << std::endl;

    return 0;

}

 

创建一个BUILD文件(vi BUILD

BUILD

cc_binary(

        name="hello",

        srcs=["hello.cc"],

)

 

编译此文件, bazel build hello,生成的可执行文件会位于bazel-bin文件夹下

然后执行 bazel-bin/hello 就可以得到执行结果了。

Hello world

 

下面为第二个例子,讲解依赖关系:

同样的过程,改写hello.cc 我们去掉get_greet 函数

#include <ctime>

#include <string>

#include <iostream>

#include "greet.h"

 

int main(){

    std::string who = "world";

    std::cout<<get_greet(who) << std::endl;

    return 0;

}

 

创建greet.hgreet.cc

#include "greet.h"

#include <string>

 

std::string get_greet(const std::string& who) {

  return "Hello " + who;

}

 

 

 

#include <string>

std::string get_greet(const std::string &thing);

 

改写BUILD

cc_library(

    name = "greet",

    srcs = ["greet.cc"],

    hdrs = ["greet.h"],

)

 

cc_binary(

    name = "hello",

    srcs = ["hello.cc"],

    deps = [":greet"],

)

 

bazel运行结果不变。

bazel编译,主要就是完成BUILD文件的改写,test这个文件夹,叫做一个package,里面有两个target(greet,hello),复杂的project,会有多个文件夹,也就是package。pacakge之间,也是通过deps相连,同时还可以设置 visiblity = ["//xxx"],表示本package对谁可见。

 

​​​​​​​注意事项

cc_library生成一个lib文件,cc_binary得到的是一个可执行文件。git_repository用于git目录文件的拉取。

执行bazel build的命令行中,可以增加一些编译选项。

-s 选项用于在bazel编译时 在终端显示具体的编译命令(一般命令都很长,显示会有点多)

--cxxopt='-O0'  选项用于选择 编译器优化等级

--cxxopt='-D xxx' 用于加 define选项

注意 如果要加多个 –cxxopt 选项,需要分开写,不能写成--cxxopt='-O0 -D xxx '

--cxxopt='-g'  选项并不能使得最后生成的可执行文件可用gdb调式。

bazel build ... --compilation_mode=dbg 加这个选项,最后生成的可执行文件才能使用 gdb进行调试。类似于 g++编译时,要加 -g的编译选项。参考http://www.voidcn.com/article/p-nuxuhqlm-bve.html

Bazel BUILD 文件中 好像不能 有 tab 制表符,需要用 空格来替代

Bazel 中  //工作空间的根标识符,也就是你的WORKSPACE文件的路径

 https://docs.bazel.build/versions/master/tutorial/cpp.html

 

Bazel官方  https://docs.bazel.build/versions/1.2.0/tutorial/cpp.html

猜你喜欢

转载自blog.csdn.net/zgcjaxj/article/details/114968918