【问题标题】:"Missing dependency declarations" for system headers when cross-compiling with Bazel使用 Bazel 进行交叉编译时系统头文件的“缺少依赖项声明”
【发布时间】:2020-08-06 23:33:09
【问题描述】:

我正在尝试使用带有交叉编译工具链的 Bazel 交叉编译一个项目(TensorFlow C 库)。经过一番绝望(但那是另一回事),我终于设法让外部依赖项(例如 zlib 或 protobuf)的实际编译与我的工具链一起工作,但是,我现在得到 缺少依赖项声明对于生成此错误的已编译规则所包含的所有系统头文件(由交叉编译工具链提供)。

Bazel's own tutorial for configuring C++ toolchains 中描述了这个确切的错误(在第 10 步的最底部)。他们还提出了一个修复方法,包括将feature 添加到CcToolchainConfigInfo,通过-isystem 标志添加系统头目录。

该修复程序的问题是我无法按照描述添加这些目录的绝对路径,因为这会触发此错误:包含路径...引用了执行根之外的路径。

除了使用绝对路径,我还尝试在我的 WORKSPACE 中声明 new local repositoriesfilegroupscc_libraries 列出它们的 srcs/hdrs/includes 中的路径并引用那些filegroups/cc_libraries-isystem 标志中,但我的尝试都没有奏效。也许我做得不对,但我尝试了很多变化。

如果我无法添加绝对路径或让它在本地存储库中运行,那么正确的做法是什么?

【问题讨论】:

  • 该工具链是从您的主机安装和访问的(在这种情况下,绝对路径实际上是合适的)还是您项目的外部依赖项?
  • 它已安装并从我的主机访问。

标签: c++ tensorflow cross-compiling bazel toolchain


【解决方案1】:

为了检查您正在从主机使用哪些头文件并且应该被视为系统头文件/即使没有明确声明为依赖项也被认为是可以的,您将包含此类头文件的目录列表提供给@的cxx_builtin_include_directories属性987654321@,因为您正在定义您的cc_toolchain。例如为我的系统编译器和主机的系统库编写一个,我可以说:

cc_common.create_cc_toolchain_config_info(
    ...
    cxx_builtin_include_directories = [
        "/usr/include/",
        "/usr/lib64/gcc/x86_64-slackware-linux/9.3.0/include/",
    ],
    ...
)

我目前不知道对于不在 bazel 自己的树中的主机工具执行此操作的另一种方法。至少从 3.1.0 开始,它可以工作并记录在案。

注意:这会配置依赖项检查,而不是搜索工具的路径,这就是您提到的适当的feature 发挥作用的地方。

【讨论】:

  • 这确实成功了。我不敢相信它一直在我的眼皮底下,尽管在我的辩护中,我认为 Bazel 在他们自己的教程中提供的解决方案至少有点误导。不管怎样,你帮了我一个大忙。非常感谢您的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
相关资源
最近更新 更多