我有一个项目(有 main.cpp
和一些头文件。是的,这是一个Catch2测试项目,在这个项目中描述了 博客). 它编译并运行。
我的问题是。除非我添加更多的源文件(我的测试用例),否则这个项目没有任何用处。这些源文件使用了项目中的一个头文件,同时也带来了一些其他的依赖关系(我想测试的库)。
简单的解决方案是复制这个项目,添加需要的文件,然后我们就完成了。
有没有更好的方法?目前在qmake中,我把项目定义在了 catch.pri
文件。通过在项目中加入这个文件,我已经拥有了qt和catch2设置的一切,只需要通过修改 SOURCES
-变量和要测试的代码的依赖性。
将其映射到 CMake 让我产生了疑问。
第一: 当我包括有一行像:
add_executable(tests main.cpp ${SOURCES})
我可以定义 SOURCES
在后面的行文中?
第二,也是更重要的一点:这样做是个好主意吗?
我可以在后面一行定义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
.
有更好的方法吗?
没有,通常情况下是这样做的。任何库的子项目都是用 .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文件是代码,它们应该被当作代码对待,这意味着它们应该是干净的、模块化的和可读的。
将test_template定义为一个静态库并没有错,它提供了main.cpp。
这样我就可以把我的测试定义为新的可执行文件,包括测试文件、库依赖和其他什么,而且只需要链接到静态库。