C++ 和 Bazel

报告问题 查看来源 每晚 · 7.2。 · 7.1敬上 · 7.0 · 6.5 · 6.4

本页包含可帮助您将 Bazel 与 C++ 项目结合使用的资源。它与 教程、构建规则以及其他与构建 C++ 相关的 项目和项目。

使用 Bazel

以下资源有助于您在 C++ 项目上使用 Bazel:

最佳做法

除了常规 Bazel 最佳做法之外,下面还介绍了 C++ 项目特有的最佳实践。

BUILD 文件

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

  • 每个 BUILD 文件都应包含一个 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 目录快捷方式,如 .(当前目录)或 .. (父级目录)。

  • 对于要求包含外部的旧版代码或 third_party 代码, 项目代码库(例如外部代码库包含,且包含需要前缀)、 请使用 include_prefixstrip_include_prefix cc_library 规则目标的参数。

工具链功能

以下可选功能 可以改善 C++ 项目的健全度。您可以使用 --features命令行标记或features属性 repo, packagecc_* 规则:

  • 借助 parse_headers 功能,可以使用 C++ 编译器解析 (但不编译)构建目标中的所有头文件及其依赖项 使用 --process_headers_in_dependencies 标记。这有助于发现仅使用头文件的库中的问题,并确保 标头是独立的,与它们的顺序无关 包括在内。
  • layering_check 功能强制目标仅包含标头 由其直接依赖项提供默认工具链支持此项 功能(使用 clang 作为编译器)。