googlemock-如何处理“多个定义”问题?

时间:2019-04-30 00:56:33

标签: c++ cmake googletest

在我的CMakeLists.txt文件中,我有:

include_directories("${algorithm}/include")
add_executable(
        test_runner
        test_runner.cpp
        test_file1.cpp
        test_file2.cpp
        test_file2.cpp
)
target_link_libraries(
        test_runner
        gtest_main)
gtest_discover_tests(test_runner)

不幸的是,这不起作用,因为这些文件都从algorithm.c导入"${algorithm}/include"

我不知道该怎么办。如何拥有多个都依赖algorithm.c的{​​{1}}依赖的test_file?

我被迫将所有test_files放在一个文件中,还是为每个文件制作一个单独的可执行文件?那将是非常不幸的。

还有其他选择吗?我希望涉及标题吗?还是test_runner必须是我要导入的库?

2 个答案:

答案 0 :(得分:0)

您可以将包含源文件的内容包装到其他头文件中,该文件具有适当的包含保护措施。像这样:

// File: algorithm_test.h
#ifndef ALGORITHM_TEST_H
#define ALGORITHM_TEST_H

#include <algorithm.c>
#endif /* ALGORITHM_TEST_H */

之后,您的测试(test_file1.cpptest_file2.cpp等)可能会包含此标头,而不是直接包含源文件:

// File: test_file1.cpp
#include <algorithm_test.h>

... define test methods ...

答案 1 :(得分:-1)

您可以使用称为header guards的名称。您可以添加

#ifndef ALGORITHM_C
#define ALGORITHM_C

到代码的开头,#endif到结尾。这样一来,文件将被编译一次,然后定义ALGORITHM_C标志,并且无论将其包含多少次,都将永远不会再次重新编译代码。

如果您无法编辑algorithm.c,可以考虑做的是在您的编译中添加algorithm.c,然后制作一个合适的algorithm.h,而无需编写任何代码,只需编写您需要测试的功能的签名,然后放入标头保护该标头,并包含该标头。