2017-02-14 44 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>)