将GTest与现有CMake项目集成:共享相同的目标源 我有一个大型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)

将GTest与现有CMake项目集成:共享相同的目标源 我有一个大型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),c++,cmake,googletest,C++,Cmake,Googletest,然后在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_subdirector

然后在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最不痛苦的方式是什么?我正在考虑建立一个测试/子目录,就像我在这里看到的:


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

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

  • mylib,一个与当前mylib目标非常相似的库目标,但没有run.cpp文件
  • mylib_exe编译run.cpp并链接到mylib的可执行目标

现在,您的测试文件可以链接到mylib。

谢谢,我应该在test/CMakeLists.txt或根CMakeLists.txt中执行到“mylib”的链接吗?答案是主观的,但我喜欢将依赖项列表(包括或库)保持在需要的目标附近。反之亦然,在测试目录之外,可能没有任何东西关心测试,所以将它放在测试定义附近。