2017-02-14 4 views
2

私はライブラリ内のクラスの単体テストを作成しようとしています。ライブラリを構築し、 テストは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)です。 そして私は、私は変更を加えた場合test/CMakeLists.txtは のように見えます。私はすでに仕事にBarと の相互作用を持たずにそのユニットテストを実行することができFooを言うために、ライブラリ(すなわち を構築することなく、ユニットテストを構築したいと思いますので、この:

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>) 
関連する問題