C++ Bazel允许我包含来自全局安装库的标题

C++ Bazel允许我包含来自全局安装库的标题,c++,bazel,C++,Bazel,使用cc\u库,我可以包含,因为它位于/usr/include中。如何使构建失败?包含任意系统头的能力使得验证构建是否可复制和自包含,以及是否使用了特定版本的库(我宁愿在工作区中包含库,以保证它们的确切版本)变得困难 $cat构建 图书馆( name=“示例”, srcs=[“:example.cpp”], ) $cat example.cpp #包括 当然,我仍然希望能够包括标准C++和POSIX报头。IIRC这归结为您的工具链配置(CROSSTOOL文件),其中cxx\u builtin\

使用
cc\u库
,我可以包含
,因为它位于
/usr/include
中。如何使构建失败?包含任意系统头的能力使得验证构建是否可复制和自包含,以及是否使用了特定版本的库(我宁愿在工作区中包含库,以保证它们的确切版本)变得困难

$cat构建
图书馆(
name=“示例”,
srcs=[“:example.cpp”],
)
$cat example.cpp
#包括

当然,我仍然希望能够包括标准C++和POSIX报头。IIRC这归结为您的工具链配置(
CROSSTOOL
文件),其中
cxx\u builtin\u include\u目录
路径中的头在这个意义上是免费的,请检查您的所有依赖项是否已正确声明

换句话说,如果您想确保只使用编译器和相应的sysroot头文件,而不会被系统上的任何其他文件所污染,那么您必须为此定义自己的工具链(而不是依赖于主机上的工具链)。这样做并将工具链设置为外部依赖通常不是一个坏主意,如果您真的想确保构建在所有方面都是一致的(这比与之相关的开销(包括编写配置的初始成本)更令人担忧)。能够使用主机上已经存在的工具很方便,但可能会带来差异(除非您能够可靠地控制每台机器的设置)

$ cat BUILD
cc_library(
    name = "example",
    srcs = [":example.cpp"],
)
$ cat example.cpp
#include <boost/lexical_cast.hpp>