首页 > 解决方案 > Bazel 允许我包含来自全局安装的库的标头

问题描述

使用cc_library,我可以包含<boost/lexical_cast.hpp>,因为它在/usr/include. 如何使构建失败?包含任意系统头文件的能力使得很难验证构建是否可重现和独立,以及是否使用了特定版本的库(我宁愿在工作区中包含库,以保证它们的确切版本)。

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

当然,我仍然希望能够包含标准 C++ 和 POSIX 头文件。

标签: c++bazel

解决方案


恐怕你在这里不走运。IIRC 这归结为您的工具链配置(CROSSTOOL特别是文件),其中在cxx_builtin_include_directory路径中找到的标头在这个意义上是给定免费通行证的 WRT 检查您的所有依赖项是否已正确声明。

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


推荐阅读