现在我有一个makefile,我链接并运行我的测试.当我构建测试时,我编译并链接测试库和测试源本身.此测试还定义了库依赖项的模拟.链接时,模拟符号会被解析为模拟实现,并且所有内容都按预期工作.但它这样做的原因是我没有链接实际的依赖库,我只链接测试源中定义的模拟符号.
主要问题是:我如何使用Bazel做到这一点?当链接cc_test目标的二进制文件时,Bazel compilis并链接所有传递依赖项.由于受测试的库依赖于(通过deps)符号的实际实现,这个真实的定义与模拟的一起被链接,自然我得到这个错误: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"], )
我不是巴泽尔的新手,但我也不是专家,花了很多时间尝试我失败的事情.有关如何使其工作的任何建议?
您的问题可能是一个非常基本的问题,它与名称空间和/或扩展类有关.根据定义,c没有名称空间,但可以以某种方式模拟它们:
https://stackoverflow.com/a/28535585/1019850
但是,由于您可能使用c而且从不使用c,因此可以直接使用命名空间.
具体的问题是你有两倍的功能,用命名空间a.some_function()和b.some_function()表示.
在Bazel中有几个选项如何解决它,我发布了简短的复制片段,你要在链接页面上阅读的细节.
deps = [ "@gtest//:main", "//lib:hello-greet", ],
链接:https://docs.bazel.build/versions/master/cpp-use-cases.html
在那里,代码片段也用于测试,但我认为这与您的问题无关.
然后在Bazel中存在工具链,这是一个例子:
config_setting( name = "on_linux", constraint_values = [ "@bazel_tools//platforms:linux", ], ) config_setting( name = "on_windows", constraint_values = [ "@bazel_tools//platforms:windows", ], ) bar_binary( name = "myprog", srcs = ["mysrc.bar"], compiler = select({ ":on_linux": "//bar_tools:barc_linux", ":on_windows": "//bar_tools:barc_windows", }), )
链接:https://docs.bazel.build/versions/master/toolchains.html
因为我不是用c或c编程,所以我需要花费相当长的时间来挖掘解决方案,所以我要保持它没有真正的解决方案,但我希望问题和解决方法的方法得到了一点清楚.我首先尝试使用第二个链接,位于上面的第一个片段下面.