Bazel 是否具有类似于 gcc -( archives -) 或 --start-group archives --end-group link 的功能?处理库之间的循环依赖?
或者,Bazel 是否具有我们可以在 Bazel 中使用此 gcc 功能的功能?例如,使用 CCFLAGS 之类的东西?
最佳答案
许多人认为,最好首先避免循环依赖。
假设您有两个文件,其中 a.cc
#includes b.h
和 b.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.h
和 b.h
复制到某个“公共(public) header ”文件夹(它本身不依赖于任何其他内容) .这消除了文件级循环依赖,但在语义上,源代码在 a
和 b
之间仍然存在循环依赖。
关于c++ - 如何处理 Bazel 中的 C++ 库循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45353395/