如何使用catch2和qt和trompeloeil创建用于创建测试可执行文件的模板?
我有一个项目(带有如何使用catch2和qt和trompeloeil创建用于创建测试可执行文件的模板?,qt,cmake,catch2,trompeloeil,Qt,Cmake,Catch2,Trompeloeil,我有一个项目(带有main.cpp和一些标题。是的,这是一个Catch2测试项目,如本文所述)。它编译并运行 我的问题是:除非我添加更多的源文件(我的测试用例),否则这个项目没有任何用处。 这些源文件使用项目中的一个头,并引入一些其他依赖项(我要测试的库) 简单的解决方案是复制这个项目,添加所需的文件,我们就完成了 有更好的办法吗?目前使用qmake,我在catch.pri文件中定义了项目。通过在项目中包含这一点,我就拥有了qt和catch2设置的一切,并且只需要通过修改SOURCES-变量和要
main.cpp
和一些标题。是的,这是一个Catch2测试项目,如本文所述)。它编译并运行
我的问题是:除非我添加更多的源文件(我的测试用例),否则这个项目没有任何用处。
这些源文件使用项目中的一个头,并引入一些其他依赖项(我要测试的库)
简单的解决方案是复制这个项目,添加所需的文件,我们就完成了
有更好的办法吗?目前使用qmake,我在catch.pri
文件中定义了项目。通过在项目中包含这一点,我就拥有了qt和catch2设置的一切,并且只需要通过修改SOURCES
-变量和要测试的代码的依赖项来定义带有测试用例的文件
将此映射到CMake会让我提出以下问题:
第一:当我包含一行时,例如:
add_executable(tests main.cpp ${SOURCES})
我可以在后面的一行中定义源吗
第二,也是更重要的一点:这样做是一个好主意吗
有更好的办法吗
不,事情通常是这样做的。任何库/子项目都包含在.pri
文件中。当然,您可以将子项目设置为git子模块
我可以在后面的一行中定义源吗
简短回答:没有
例如:
假设我们有一个小项目,其中有一个文件a.cpp
和一个CMakeLists.txt
,如下所示:
cmake_minimum_required(VERSION 3.12)
project(testing)
add_executable(testing ${sources})
#defining ${sources} later
set(sources a.cpp)
src/
|--lib/
|--tests/
|---- CMakeLists.txt
CMakeLists.txt
main.cpp
如果您尝试生成此文件,将导致错误:
未向目标提供源:测试
我假设您希望将源
变量的定义分离到一个单独的文件中。在这种情况下,我们可以如下解决。假设我们有一个dir结构,如下所示:
cmake_minimum_required(VERSION 3.12)
project(testing)
add_executable(testing ${sources})
#defining ${sources} later
set(sources a.cpp)
src/
|--lib/
|--tests/
|---- CMakeLists.txt
CMakeLists.txt
main.cpp
我们的cmake文件将与以前相同,在添加可执行文件之前进行了以下附加更改:
add_subdirectory(tests)
在tests/
内的CMakeLists.txt
文件中,您可以定义${SOURCES}
变量:
set(SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/test.cpp
PARENT_SCOPE
)
add_executable(tests ${SOURCES})
请注意,您需要在此处使用PARENT\u SCOPE
使此SOURCES
变量对父目录可见,在本例中,父目录是src/
现在,在我们的mainCMakeLists.txt
中,我们可以使用以下变量:
set(SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/test.cpp
PARENT_SCOPE
)
add_executable(tests ${SOURCES})
第二,也是更重要的一点:这样做是一个好主意吗
视情况而定。如果您有一个简单的单目录项目,那么就没有必要了。如果您有多个目录,那么当然,每个目录都应该有自己的CMake
文件,该文件定义了自己的变量。CMake文件是代码,它们应该被视为代码,这意味着它们应该是干净的、模块化的和可读的
我可以在后面的一行中定义源吗
是的,但不是你那样做的。您可以使用少量源定义可执行目标测试
,也可以使用无源定义可执行目标,但您可以在以后使用命令附加更多源
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
...
)
类似地,您可以稍后使用将编译标志添加到此测试
目标,并使用目标链接库
将依赖项添加到链接到测试
将测试模板定义为提供main.cpp>的静态库没有错
通过这种方式,我将我的测试定义为新的可执行文件,带有测试文件、库依赖项等等,并且只需要链接到静态库。那么在tests/CMakeLists.txt
中,我可以对测试项目进行所有修改吗?类似于将依赖项添加到测试
可执行文件。或为编译设置标志?您只能添加文件。但是您不能添加依赖项(外部库)或标志,因为您的目标,即,测试
位于主cmake文件中,并且尚未定义。您可以将目标移动到tests/
目录,然后设置标志/添加依赖项;用add_subdirectory
将其加载到我当前的测试项目中,并添加我的测试文件、依赖项和furhter标志?这对我来说似乎是一种方法。@generic\u opto\u guy是的,你总是可以附加源代码和其他编译标志/依赖项,即使是在你的CMake项目的早期子目录中定义的目标。但是我不能target\u link\u库
,因为我遇到了问题。@generic\u opto\u guy是的,在CMake 3.13之前,您必须将target\u link\u libraries()
调用放在创建目标的同一目录中。将您的CMake升级到3.13或更高版本。