我正在尝试为库中的类编写单元测试。构建lib和 测试是用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
单元测试,不要再为库建立它?所有标志都是一样的。
答案 0 :(得分: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>)