C++ 和 Bazel

报告问题 查看源代码 每夜 build · 8.0 . 7.47.3 · 7.2 · 7.1 · 7.0 · 6.5

本页面包含有助于您将 Bazel 与 C++ 项目搭配使用的资源。该页面会链接到教程、构建规则以及与使用 Bazel 构建 C++ 项目相关的其他信息。

使用 Bazel

以下资源可帮助您在 C++ 项目中使用 Bazel:

最佳做法

除了常规 Bazel 最佳实践之外,下面还列出了适用于 C++ 项目的最佳实践。

BUILD 文件

创建 BUILD 文件时,请遵循以下准则:

  • 每个 BUILD 文件应包含目录中每个编译单元的 1 个 cc_library 规则目标。

  • 您应尽可能细化 C++ 库,以最大限度地提高增量性并并行构建。

  • 如果 srcs 中只有一个源文件,请将库的名称与该 C++ 文件的名称保持一致。此库应包含 C++ 文件、任何匹配的头文件以及库的直接依赖项。例如:

    cc_library(
        name = "mylib",
        srcs = ["mylib.cc"],
        hdrs = ["mylib.h"],
        deps = [":lower-level-lib"]
    )
    
  • 在文件中,每个 cc_library 目标对应一个 cc_test 规则目标。将目标文件命名为 [library-name]_test,将源文件命名为 [library-name]_test.cc。例如,上述 mylib 库目标的测试目标将如下所示:

    cc_test(
        name = "mylib_test",
        srcs = ["mylib_test.cc"],
        deps = [":mylib"]
    )
    

包含路径

请遵循以下准则设置 include 路径:

  • 将所有包含路径设为相对于工作区目录。

  • 对于非系统头文件,请使用带引号的包含 (#include "foo/bar/baz.h"),而不是尖括号 (#include <foo/bar/baz.h>)。

  • 避免使用 UNIX 目录快捷方式,例如 .(当前目录)或 ..(父级目录)。

  • 对于需要将 include 指向项目代码库之外的旧版或 third_party 代码(例如需要前缀的外部代码库 include),请在 cc_library 规则目标上使用 include_prefixstrip_include_prefix 参数。

工具链功能

以下可选功能可以改善 C++ 项目的代码质量。您可以使用 --features 命令行标志或 repopackagecc_* 规则的 features 属性启用这些功能:

  • 借助 parse_headers 功能,在使用 --process_headers_in_dependencies 标志时,C++ 编译器会用于解析(但不会编译)已构建目标中的所有头文件及其依赖项。这有助于发现头文件库中的问题,并确保头文件是自包含的,不依赖于包含顺序。
  • layering_check 功能会强制要求目标仅包含其直接依赖项提供的头文件。默认的工具链在 Linux 上支持此功能,并使用 clang 作为编译器。