2017-02-14 56 views
2

我试图编写库中的类的单元测试。建立lib和 测试是用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 

是否有可能避免这也就是说,如果我有建src/Foo.cpp b对于 单元测试之前,不要再为一个库建立它?所有的标志都是一样的。

回答

1

如果你不介意额外的目标,那就是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>)