本页包含可帮助您将 Bazel 与 C++ 项目结合使用的资源。它与 教程、构建规则以及专门用于构建 C++ 组件的其他信息, 项目和项目。
使用 Bazel
以下资源有助于您在 C++ 项目上使用 Bazel:
- 教程:构建 C++ 项目
- C++ 常见用例
- C/C++ 规则
- 基础库
<ph type="x-smartling-placeholder">
- </ph>
- Abseil
- 提升
- HTTPS 请求:CPR 和 libcurl
- C++ 工具链配置
- 教程:配置 C++ 工具链
- 与 C++ 规则集成
最佳做法
除了常规 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_prefix
和strip_include_prefix
cc_library
规则目标的参数。
工具链功能
以下可选功能
可以改善 C++ 项目的健全度。您可以使用
--features
命令行标记或features
属性
repo
、
package
或 cc_*
规则:
- 借助
parse_headers
功能,可以使用 C++ 编译器解析 (但不编译)构建目标中的所有头文件及其依赖项 使用--process_headers_in_dependencies
标志。这有助于发现仅使用头文件的库中的问题,并确保 标头是独立的,与它们的顺序无关 包括在内。 layering_check
功能强制目标仅包含标头 由其直接依赖项提供默认工具链支持此项 功能(使用clang
作为编译器)。