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
如何使用catch2和qt和trompeloeil创建用于创建测试可执行文件的模板?_Qt_Cmake_Catch2_Trompeloeil - Fatal编程技术网

如何使用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/

现在,在我们的main
CMakeLists.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或更高版本。