【问题标题】:C++ / Bazel: How to include angle <> bracket system headers?C ++ / Bazel:如何包含角<>括号系统标题?
【发布时间】:2018-07-19 16:00:55
【问题描述】:

问题:我正在努力构建包含在尖括号中的外部依赖项。

背景:我有一个包含 Eigen 库的头文件:

#include <Eigen/Dense>

这是作为外部依赖安装在系统本地的。由于各种原因,目前修改依赖项的安装方式并不是一个现实的选择。

所以我需要将外部依赖项一致地封装为 Bazel 目标。目前我正在研究一个只有标题的目标,如下所示:

cc_library(
   name = "my_library",
   hdrs = [ "some/local/header.h"],
   textual_hdrs = ["@system_deps//:eigen3"],
   deps = ["@system_deps//:eigen3"],
)

这是基于我的理解,即 (1) 非 .h 文件需要位于 textual_hdrs 中,以及 (2) 当它不是 deps 的一部分时它肯定看不到它。但我承认我在这里是在黑暗中抓狂。

这当然指向我的工作区:

new_local_repository(
  name = "system_deps".
  path = "/usr/include/eigen3",
  build_file_content = """
     cc_library(
       name="eigen3",
       textual_hrds = glob["Eigen/*"]),
       visibility = ["//visibility:public"],
     )
  """,
  )

结果:错误:'Eigen/Dense' 文件未找到等等等等

(当我的头文件包含在其他地方时会发生这种情况。)

有趣的是,它确实以某种方式找到了 Eigen/Dense,因为它(正确地)抱怨它找不到包含的另一个文件。不确定是否

那么:正确的方法是什么?我读过其他类似的问题,但还没有完全掌握如何封装这些外部依赖项。

【问题讨论】:

    标签: c++ bazel


    【解决方案1】:

    cc_binary.includes 属性有帮助吗?

    【讨论】:

    • 更新,设法让它找到它使用这个:github.com/bazelbuild/bazel/issues/182 现在它抱怨使用尖括号。我在我能想到的每个配置中都尝试了“包含”,但没有。要我放弃那些尖括号!有什么作用:1)使用引号而不是尖括号。 (根据要求。)这最终会很好,但它会在迁移过程中阻止任何类型的并行构建系统。 2)使用 --copt="-I/usr/include/eigen3/" .... 我的阅读说这相当于使用包含,但不知何故不是?有什么想法吗?
    • 如果您使用 strip_include_prefix 和/或 include_prefix,bazel 将添加 -I 标志而不是 -isystem。这是一个丑陋的不一致,我同意。但我仍然认为它比 copts 更好(特别是因为 copts 不是传递的,如果一个目标依赖于你的目标,他们必须再次手动添加 copts)。
    • 如果我能多次投票给@hlopko,我会的!挠头 4 小时后救了我! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多