2017-07-27 472 views
1

Bazel的功能类似于gcc - (archives - )还是--start-group archives --end-group link来处理库之间的循环依赖关系?如何处理Bazel中的C++库循环依赖项?

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

回答

1

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

假设你有两个文件,其中a.cc的#includes b.hb.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.hb.h某些“公共标题”文件夹(它本身不依赖于其他任何内容)。这将删除文件级循环依赖关系,但在语义上,源代码仍然具有ab之间的循环依赖关系。