c++ - 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 头文件。
解决方案
恐怕你在这里不走运。IIRC 这归结为您的工具链配置(CROSSTOOL
特别是文件),其中在cxx_builtin_include_directory
路径中找到的标头在这个意义上是给定免费通行证的 WRT 检查您的所有依赖项是否已正确声明。
换句话说,如果你想确保你只使用你的编译器和相应的 sysroot 头文件,但不会被系统上的任何其他东西污染,你必须为此定义自己的工具链(而不是依赖于在您的主机上找到)。这样做并将您的工具链设置为外部依赖项通常可能不是一个坏主意,如果您真的想确保您的构建全面一致(这比与之相关的开销更令人担忧,包括初始编写成本配置)。能够使用主机上已经存在的工具很方便,但可能会引入差异(除非您可以可靠地控制每台机器的设置)。
推荐阅读
- java - JedisDataException:不允许 MULTI 内的 ERR WATCH
- python - 在 django 应用程序中,即使迁移文件夹文件被删除,此错误也存在“关系“blog_no_of_views”不存在”
- html - Html 中包含 java 脚本。如何从中提取 HTML 标签
- vue.js - 从 vuex 中的模块 getter 访问根状态
- html - 如何过滤具有多个复选框的数据表
- c# - 如何创建节点以查看 3D 场景?
- variables - 可以将命令保存在变量中吗?
- javascript - 如何通过 post 和 ajax 安全地提交价格?
- python-3.x - pd.rename 键 KeyError: 'New_Name'
- android - 使用 Alarmmanager (Android Studio) 只显示一次通知