如何处理Bazel中的c ++库循环依赖?

时间:2017-07-27 14:14:18

标签: c++ circular-dependency bazel

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

或者,Bazel有一个功能,我们可以在Bazel中使用这个gcc功能吗?例如,使用像CCFLAGS?

这样的东西

2 个答案:

答案 0 :(得分:2)

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

假设您有两个文件,其中>>> super(ClsTwo,entity).__init__() Here's One >>> super(ClsThree,entity).__init__() Here's Two Here's Threee >>> super(ClsThreee,entity).__init__() Here's Two >>> super(ClsFour,entity).__init__() Here's Three #includes a.ccb.h #includes b.cc

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.h复制到某些“公共标题”文件夹(它本身不依赖于任何其他内容)。这将删除文件级循环依赖关系,但从语义上讲,源代码仍然具有b.ha之间的循环依赖关系。

答案 1 :(得分:0)

如果您不拥有这些库,则必须等到https://gist.github.com/sfrehse/02c7d57fad862c71c20f07c59caba240实施。另请参阅cc_import-kind-of-rule。我不知道同时解决方法。