c++ - Bazel 允许我包含来自全局安装的库的 header

标签 c++ bazel

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

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

当然,我仍然希望能够包含标准的 C++ 和 POSIX header 。

最佳答案

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

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

关于c++ - Bazel 允许我包含来自全局安装的库的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51232110/

相关文章:

c++ - C++ STL 中是否有任何数据结构用于执行 log(n) 中第 k 个元素的插入、搜索和检索?

c++ - 创建虚拟串口

c++ - Bazel - token 附近出现意外错误

c++ - move 语义和 std::move

c++ - 为什么不透明枚举声明不是定义?

c++ - h.264文件读取和解析

linux - CentOS 6.7 上的 "gcc: error trying to exec ' cc1plus ': execvp: No such file or directory"

bazel - Bazel 能否将需要重建的 M 个文件中的 N 个批处理成单个命令?

Bazel 一次构建多个目标

c++ - 在 bazel 中替代 "` --whole-archive`"