2

我有一个项目(带有main.cpp一些标题。是的,它是本博客中描述的 Catch2 测试项目)。它编译并运行。

我的问题是:除非我添加更多源文件(我的测试用例),否则这个项目没有任何用处。这些源文件使用项目中的一个标头并引入其他一些依赖项(我要测试的库)。

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

有没有更好的办法?目前使用 qmake 我在catch.pri文件中定义了项目。通过将其包含在项目中,我拥有了 qt 和 catch2 设置的所有内容,并且只需通过修改SOURCES-Variable 和要测试的代码的依赖项来定义带有测试用例的文件。

将此映射到CMake让我提出问题:

第一:当我包含这样一行时:

add_executable(tests main.cpp ${SOURCES})

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

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

4

3 回答 3

1

我可以在后面的行中定义 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

于 2020-06-08T12:09:56.443 回答
0

有没有更好的办法?

不,这是通常的做法。使用.pri文件包含任何库/子项目。当然,您可以将子项目设为 git-submodule。

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

简短的回答:没有

例子:

假设我们有一个带有单个文件的小项目,a.cpp如下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/

现在在我们的 mainCMakeLists.txt我们可以使用这个变量:

add_executable(tests ${SOURCES})

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

这取决于。如果您有一个简单的单目录项目,则没有必要。如果您有多个目录,那么当然,每个目录都应该有自己的CMake文件,该文件定义了自己的变量。CMake 文件是代码,它们应该被视为代码,这意味着它们应该是干净的、模块化的和可读的。

于 2020-06-08T07:17:03.480 回答
0

将 test_template 定义为提供 main.cpp 的静态库并没有错。

这样,我将我的测试定义为新的可执行文件,包含测试文件、库依赖项等,并且只需要链接到静态库。

于 2020-06-09T09:49:15.947 回答