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

C++ 使用CMake进行单元测试,无需重复编译,c++,unit-testing,cmake,C++,Unit Testing,Cmake,我正在尝试为库中的类编写单元测试。构建lib和 测试是用CMake完成的 ├── CMakeLists.txt ├── src │   ├── Bar.cpp │   ├── CMakeLists.txt │   └── Foo.cpp └── test ├── BarTest.cpp ├── CMakeLists.txt └── FooTest.cpp src/CMakeLists.txt只是add_库(例如Foo.cpp Bar.cpp)。 因为我想在不构建库的情况

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

├── CMakeLists.txt
├── src
│   ├── Bar.cpp
│   ├── CMakeLists.txt
│   └── Foo.cpp
└── test
    ├── BarTest.cpp
    ├── CMakeLists.txt
    └── FooTest.cpp
src/CMakeLists.txt
只是
add_库(例如Foo.cpp Bar.cpp)
。 因为我想在不构建库的情况下构建单元测试(即。 如果我改为说
Foo
,我可以运行它的单元测试,而不需要 与
Bar
的交互已经开始工作。因此
test/CMakeLists.txt
看起来像 这:

但是,这会导致每个源文件生成两次:

[ 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
有可能避免这种情况吗?例如,如果我之前为一个项目构建了
src/Foo.cpp

单元测试,不要为库重新构建它?所有标志都是相同的。

如果您不介意其他目标,这就是CMake的用途:

add_库(Foo对象Foo.cpp)
添加库(Bar对象Bar.cpp)
添加\u可执行文件(示例$$)
然后

add_executable(FooTest FooTest.cpp $<TARGET_OBJECTS:Foo>)
add_executable(BarTest BarTest.cpp $<TARGET_OBJECTS:Bar>)
add_可执行文件(FooTest FooTest.cpp$)
添加可执行文件(BarTest BarTest.cpp$)
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>)