Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake:如何为每个测试重用相同的test_main.cpp_C++_Cmake_Catch Unit Test - Fatal编程技术网

C++ CMake:如何为每个测试重用相同的test_main.cpp

C++ CMake:如何为每个测试重用相同的test_main.cpp,c++,cmake,catch-unit-test,C++,Cmake,Catch Unit Test,我想在monorepo中使用测试框架,其中有许多组件,每个组件都有自己的测试。我想使用CMake来定义所有构建目标 Catch2生成一个通用的main()函数,该函数将运行链接到应用程序中的所有测试。源文件(我称之为test\u main.cpp)就是这两行: #define CATCH_CONFIG_MAIN #include "catch.hpp" 我希望在我的源代码树中只有一份test\u main.cpp,并从每个有测试的组件目录中引用它(最终将有数百个目录) 如果我复制了test\u

我想在monorepo中使用测试框架,其中有许多组件,每个组件都有自己的测试。我想使用CMake来定义所有构建目标

Catch2生成一个通用的
main()
函数,该函数将运行链接到应用程序中的所有测试。源文件(我称之为
test\u main.cpp
)就是这两行:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"
我希望在我的源代码树中只有一份
test\u main.cpp
,并从每个有测试的组件目录中引用它(最终将有数百个目录)


如果我复制了
test\u main.cpp
,这样每个目录中都有一个测试的冗余副本,那么我可以看到如何设置CMake来工作,但我还没有弄清楚如何只拥有一个副本。有一个简单的技巧我忽略了吗?

尝试以以下方式将Catch2集成为CMake:

add_executable(
    project_tests EXCLUDE_FROM_ALL
    test_case1.cpp
    test_case2.cpp
    ...
)

target_link_libraries(project_tests catch)
将单个头文件
catch.hpp
test\u main.cpp
与以下
CMakeLists.txt
一起添加到它们自己的目录中(例如
Catch2
):

add_library(catch INTERFACE)
target_include_directories(catch INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
target_sources(catch INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/test_main.cpp")
然后,您可以通过以下方式在项目中的任何位置设置测试可执行文件:

add_executable(
    project_tests EXCLUDE_FROM_ALL
    test_case1.cpp
    test_case2.cpp
    ...
)

target_link_libraries(project_tests catch)

由于
test\u main.cpp
已作为接口源文件添加到
catch
,因此它将作为测试可执行文件的一部分进行编译。

。我将检查catch的逻辑,以找出它在哪里查找测试源。由于它们都是纯C代码(即Catch似乎只有在编译之后才会生效),我想这就像在项目中添加另一个编译单元一样简单。您是否尝试过将
test\u main.cpp
添加到每个
add\u executable
行中?您可能需要文件的完整路径,但类似于
${PROJECT\u SOURCE\u DIR}/test\u main.cpp
(假设您的项目顶层有
test\u main.cpp
)的东西应该可以工作。这看起来不错。我会给它尝试和批准的答案后,我已经验证了它的工作。谢谢。事实上,我们不需要复制catch.hpp并将其放入带有test_main.cpp的目录中,我们只需将test_main.cpp放在文件夹中,然后编写CMakeLists.txt,如:``添加库(catch test_main.cpp)目标链接库(catch PUBLIC Catch2::Catch2)```