如何使用qt和trompeloeil的catch2创建一个测试可执行文件的模板?

问题描述 投票:0回答:1

我有一个项目(有 main.cpp 和一些头文件。是的,这是一个Catch2测试项目,在这个项目中描述了 博客). 它编译并运行。

我的问题是。除非我添加更多的源文件(我的测试用例),否则这个项目没有任何用处。这些源文件使用了项目中的一个头文件,同时也带来了一些其他的依赖关系(我想测试的库)。

简单的解决方案是复制这个项目,添加需要的文件,然后我们就完成了。

有没有更好的方法?目前在qmake中,我把项目定义在了 catch.pri 文件。通过在项目中加入这个文件,我已经拥有了qt和catch2设置的一切,只需要通过修改 SOURCES-变量和要测试的代码的依赖性。

将其映射到 CMake 让我产生了疑问。

第一: 当我包括有一行像:

add_executable(tests main.cpp ${SOURCES})

我可以定义 SOURCES 在后面的行文中?

第二,也是更重要的一点:这样做是个好主意吗?

qt cmake catch2
1个回答
2
投票

我可以在后面一行定义SOURCES吗?

是的,但不是你所做的那种方式。你可以定义你的可执行目标 tests 有几个来源或 没有 源,但您可以在以后使用 target_sources 命令。

add_executable(tests main.cpp)

...

# Later in the CMake file (or in another CMake file added via 'add_subdirectory').
target_sources(tests PRIVATE
    MyTestClass1.cpp
    MyTestClass2.cpp
    ...
)

同样,你也可以将编译标志添加到这个 tests 后用 target_compile_options,并添加依赖关系以链接到 tests 使用 target_link_libraries.


1
投票

有更好的方法吗?

没有,通常情况下是这样做的。任何库的子项目都是用 .pri 文件,当然,你也可以把子项目做成git-submodule。当然,你也可以把子项目做成git-submodule。

我可以在后面一行定义 SOURCES 吗?

答案很简单。不可以

例子:

假设我们有一个小项目,里面只有一个文件。a.cpp 和a CMakeLists.txt 如下所示。

cmake_minimum_required(VERSION 3.12)
project(testing)
add_executable(testing ${sources})
#defining ${sources} later
set(sources a.cpp)

如果你试图建立这个,它会导致一个错误。

No SOURCES given to target: testing

我想你应该是想分开定义 sources 变量到一个单独的文件。在这种情况下,我们可以按以下方式解决。假设我们有一个如下的dir结构。

src/
|--lib/
|--tests/
|---- CMakeLists.txt
CMakeLists.txt
main.cpp

我们的cmake文件将和之前的一样,只是增加了以下改动 之前 add_executable:

add_subdirectory(tests)

CMakeLists.txt 文件夹 tests/ 你可以定义 ${SOURCES} 变量。

set(SOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/test.cpp
    PARENT_SCOPE
)

注意,你需要 PARENT_SCOPE 来此 SOURCES 变量在父目录下可见,在我们的例子中是 src/

现在在我们的主 CMakeLists.txt 我们可以使用这个变量。

add_executable(tests ${SOURCES})

第二,更重要的是,这样做是个好主意吗?

这要看情况。如果你有一个简单的单目录项目,那么没有必要。如果你有多个目录,那么当然,每个目录应该有自己的 CMake 文件,它定义了自己的变量。CMake文件是代码,它们应该被当作代码对待,这意味着它们应该是干净的、模块化的和可读的。


0
投票

将test_template定义为一个静态库并没有错,它提供了main.cpp。

这样我就可以把我的测试定义为新的可执行文件,包括测试文件、库依赖和其他什么,而且只需要链接到静态库。

© www.soinside.com 2019 - 2024. All rights reserved.