Bazel的功能类似于gcc - (archives - )还是--start-group archives --end-group link来处理库之间的循环依赖关系?如何处理Bazel中的C++库循环依赖项?
或者,Bazel有一个功能,我们可以在Bazel中使用这个gcc功能吗?例如,使用像CCFLAGS的东西?
Bazel的功能类似于gcc - (archives - )还是--start-group archives --end-group link来处理库之间的循环依赖关系?如何处理Bazel中的C++库循环依赖项?
或者,Bazel有一个功能,我们可以在Bazel中使用这个gcc功能吗?例如,使用像CCFLAGS的东西?
许多人认为最好先避免循环依赖。
假设你有两个文件,其中a.cc
的#includes b.h
和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.h
某些“公共标题”文件夹(它本身不依赖于其他任何内容)。这将删除文件级循环依赖关系,但在语义上,源代码仍然具有a
和b
之间的循环依赖关系。
如果你不拥有这些库,你必须等到cc_import-kind-of-rule被实现。另见issue #818。我没有意识到这段时间的解决方法。