【问题标题】:How to handle c++ library circular dependency in Bazel?如何在 Bazel 中处理 c++ 库循环依赖?
【发布时间】:2018-01-03 08:05:22
【问题描述】:

Bazel 是否有类似于 gcc -( archives -) 或 --start-group archives --end-group link 的功能来处理库之间的循环依赖关系?

另外,Bazel 是否有一个特性,我们可以在 Bazel 中使用这个 gcc 特性?例如,使用 CCFLAGS 之类的东西?

【问题讨论】:

    标签: c++ circular-dependency bazel


    【解决方案1】:

    许多人认为,最好首先避免循环依赖。

    假设你有两个文件,a.cc #includes b.hb.cc #includes a.h:

    cc_library(
      name="a",
      srcs=["a.cc"],
      hdrs=["a.h"],
      deps=[":b"],  # a.cc #includes b.h
    )
    
    cc_library(
      name="b",
      srcs=["b.cc"],
      hdrs=["b.h"],
      deps=[":a"],  # b.cc #includes a.h
    )
    

    bazel 会抱怨循环依赖。

    如果你拥有所有有问题的代码,避免这些循环依赖的更直接的方法是重新调整你的源代码和 bazel 包,以首先避免依赖。

    这里的一个策略是将常见的东西重构到第三个“核心”库c,它既不依赖于a,也不依赖于b

    cc_library(
      name="a",
      srcs=["a.cc"],
      hdrs=["a.h"],
      deps=[":c"],  # a.cc #includes c.h
    )
    
    cc_library(
      name="b",
      srcs=["b.cc"],
      hdrs=["b.h"],
      deps=[":c"],  # b.cc #includes c.h
    )
    
    cc_library(
      name="c",
      srcs=["c.cc"],
      hdrs=["c.h"],
    )
    

    另一种策略是使用某种构建步骤将a.hb.h 复制到一些“公共标头”文件夹(它本身不依赖于其他任何东西)。这样就去掉了文件级别的循环依赖,但是在语义上,源代码在ab之间还是有循环依赖的。

    【讨论】:

      【解决方案2】:

      如果您不拥有这些库,则必须等到cc_import-kind-of-rule 实施。另见issue #818。目前我不知道有什么解决方法。

      【讨论】:

        猜你喜欢
        • 2014-08-02
        • 2018-10-19
        • 2016-05-02
        • 1970-01-01
        • 2011-07-26
        • 2015-07-06
        • 2012-06-07
        相关资源
        最近更新 更多