将 GTest 与现有的 CMake 项目集成:共享相同 target_sources

Integrating GTest with existing CMake Project: share the same target_sources

我有一个很大的 C++ 库,想用 GTest 做一些测试。 目前,构建是用 CMake 处理的,特别是在根目录中有一个 CMakeLists.txt 文件,如下所示

make_minimum_required(VERSION 3.13.0)
project(mylib)

find_package(PkgConfig REQUIRED)

set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
set(CMAKE_INSTALL_RPATH "${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src/.libs/")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

SET(BASEPATH "${CMAKE_SOURCE_DIR}")
INCLUDE_DIRECTORIES("${BASEPATH}")

add_executable(mylib run.cpp)
add_subdirectory(src)
add_subdirectory(proto)


target_include_directories(mylib PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/math
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src
    ... some dirs ...
)

target_link_directories(mylib PRIVATE
    ... some libs ..
)

target_link_libraries(mylib 
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/math
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src
    .....
)

target_compile_options(mylib PUBLIC -D_REENTRANT -fPIC)

然后在src目录和每个子目录下都有一个CMakeLists.txt文件,比如这个在src/

target_sources(mylib
  PUBLIC
    includes.hpp
)

add_subdirectory(algorithms)
add_subdirectory(collectors)
add_subdirectory(hierarchies)
add_subdirectory(mixings)
add_subdirectory(runtime)
add_subdirectory(utils)

我的问题如下:在当前项目中集成GTest的痛苦最小的方法是什么?我正在考虑拥有一个 test/ 子目录,就像我在这里看到的那样:

但是,此示例要求您为每个可执行文件手动列出它包含的所有文件。有没有更快的方法来使用已经添加到 'mylib' 的源?

您可以将当前的 mylib 可执行目标拆分为两个目标

  • mylib,一个与当前 mylib 目标非常相似的库目标,但没有 run.cpp 文件
  • mylib_exe 将 run.cpp 和 link 编译为 mylib
  • 的可执行目标

现在您的测试文件可以 link 到 mylib。