本页面包含可帮助您将 Bazel 与 C++ 项目结合使用的资源。其中提供了教程、构建规则以及有关如何使用 Bazel 构建 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
代码(例如需要前缀的外部代码库),请对cc_library
规则目标使用include_prefix
和strip_include_prefix
参数。
工具链功能
以下可选功能可以改善 C++ 项目的健全度。您可以使用 --features
命令行标志或 repo
、package
或 cc_*
规则的 features
属性来启用它们:
- 借助
parse_headers
功能,您可以在使用--process_headers_in_dependencies
标志时,使用 C++ 编译器解析(但不编译)构建目标中的所有头文件及其依赖项。这有助于发现仅标头库中的问题,并确保标头是独立的,并且独立于标头的包含顺序。 layering_check
功能强制使目标仅包含由其直接依赖项提供的头文件。在 Linux 上,默认工具链支持此功能,并使用clang
作为编译器。