在我的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
必须是我要导入的库?
答案 0 :(得分:0)
您可以将包含源文件的内容包装到其他头文件中,该文件具有适当的包含保护措施。像这样:
// File: algorithm_test.h
#ifndef ALGORITHM_TEST_H
#define ALGORITHM_TEST_H
#include <algorithm.c>
#endif /* ALGORITHM_TEST_H */
之后,您的测试(test_file1.cpp
,test_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,而无需编写任何代码,只需编写您需要测试的功能的签名,然后放入标头保护该标头,并包含该标头。