【发布时间】:2019-05-25 19:14:27
【问题描述】:
我有一个尝试用 Bazel 构建的 C 代码库。该代码库包含使用 fff 库在 C 中生成函数模拟的单元测试。但实际的库并不重要,我对函数模拟的整个概念有疑问。
现在我有一个生成文件,我可以在其中链接并运行我的测试。当我构建一个测试时,我编译并链接被测库和测试源本身。该测试还为库的依赖项定义了模拟。链接后,模拟符号被解析为模拟实现,一切都按预期工作。但这样做的原因是我不链接实际的依赖库,我只链接测试源中定义的模拟符号。
主要问题是:我该如何使用 Bazel?在为cc_test 目标链接二进制文件时,Bazel 编译并链接所有传递依赖项。由于被测库依赖于(通过deps)符号的实际实现,因此这个真正的定义与模拟的定义一起链接,我自然会得到这个错误:multiple definition of XXX。
例子:
cc_library(
name = "a",
# a.cc has the real version of "void some_function()".
srcs = ["a.cc"],
hdrs = ["a.h"],
)
# This test is working just fine.
cc_test(
name = "a_test",
srcs = ["a_test.cpp"],
deps = [":a"],
)
cc_library(
name = "b",
# b.cc includes a.h and uses "void some_function()".
srcs = ["b.cc"],
hdrs = ["b.h"],
deps = [":a"],
)
# This test has two definitions for "void some_function()":
# the real one and the mock one.
cc_test(
name = "b_test",
# b_test.cpp has the mock version of "void some_function()".
srcs = ["b_test.cpp"],
deps = [":b"],
)
我对 Bazel 并不完全陌生,但我也不是专家,在花了很多时间尝试之后我失败了。关于如何让它发挥作用的任何建议?
【问题讨论】:
-
为什么要标记c++ 来回答C 问题?
-
据我所知,整个项目是用 c++ 而不是 c。您使用后缀 cpp 以及 bazel 的 c++ 连接器(我认为他们没有用于 c 的连接器)。不知道是否可以使用 fff 但这是另一个问题。