c++ - 使用 CMake 进行单元测试,无需重复编译

标签 c++ unit-testing cmake

我正在尝试为库中的类编写单元测试。构建库和 测试是用 CMake 完成的。

├── CMakeLists.txt
├── src
│   ├── Bar.cpp
│   ├── CMakeLists.txt
│   └── Foo.cpp
└── test
    ├── BarTest.cpp
    ├── CMakeLists.txt
    └── FooTest.cpp

src/CMakeLists.txt 就是add_library(Example Foo.cpp Bar.cpp)。 而且因为我想在不构建库的情况下构建单元测试(即 如果我更改为 Foo 我可以运行它的单元测试而无需 与 Bar 的交互已经开始工作。所以 test/CMakeLists.txt 看起来像 这个:

add_executable(FooTest FooTest.cpp ${CMAKE_SOURCE_DIR}/src/Foo.cpp)
add_test(bla::FooTest ${CMAKE_CURRENT_BINARY_DIR}/FooTest)

add_executable(BarTest BarTest.cpp ${CMAKE_SOURCE_DIR}/src/Bar.cpp)
add_test(bla::BarTest ${CMAKE_CURRENT_BINARY_DIR}/BarTest)

但是,这会导致每个源文件被构建两次:

[ 11%] Building CXX object src/CMakeFiles/Example.dir/Foo.o
[ 22%] Building CXX object src/CMakeFiles/Example.dir/Bar.o
[ 33%] Linking CXX static library libExample.a
[ 33%] Built target Example
[ 44%] Building CXX object test/CMakeFiles/FooTest.dir/FooTest.o
[ 55%] Building CXX object test/CMakeFiles/FooTest.dir/__/src/Foo.o
[ 66%] Linking CXX executable FooTest
[ 66%] Built target FooTest
[ 77%] Building CXX object test/CMakeFiles/BarTest.dir/BarTest.o
[ 88%] Building CXX object test/CMakeFiles/BarTest.dir/__/src/Bar.o
[100%] Linking CXX executable BarTest
[100%] Built target BarTest

是否可以避免这种情况? IE。如果我之前构建了 src/Foo.cpp 单元测试,不要为库重新构建它?所有标志都相同。

最佳答案

如果您不介意额外的目标,那就是 CMake 的 object libraries用于:

add_library(Foo OBJECT Foo.cpp)
add_library(Bar OBJECT Bar.cpp)
add_executable(Example $<TARGET_OBJECTS:Foo> $<TARGET_OBJECTS:Bar>)

然后

add_executable(FooTest FooTest.cpp $<TARGET_OBJECTS:Foo>)
add_executable(BarTest BarTest.cpp $<TARGET_OBJECTS:Bar>)

关于c++ - 使用 CMake 进行单元测试,无需重复编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42221259/

相关文章:

c++ - 按字符数拆分字符串的 spirit 语法

c++ - VC++库冲突问题

c# - list.Count > 0 和 list.Count != 0 之间的区别

c++ - ld : library not found for -lbitcoin

c++ - 我可以用 g++ 编译,但得到一个有等效 cmake 的错误程序(GTK 错误)

C++ 指针和引用数据类型

node.js - 如何对 HTTP 请求进行单元测试?

c# - 如何创建一个文件来填充 HttpContext.Current.Request.Files?

c# - C# 中两个单元测试之间的依赖关系

cmake - 在模板文件中扩展变量、#cmakedefine 和生成器表达式