【问题标题】:Integrating GTest with existing CMake Project: share the same target_sources将 GTest 与现有 CMake 项目集成:共享相同的 target_sources
【发布时间】:2021-02-12 00:07:02
【问题描述】:

我有一个大型 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/ 子目录,就像我在这里看到的那样:Adding Googletest To Existing CMake Project

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

【问题讨论】:

    标签: c++ cmake googletest


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我应该在 test/CMakeLists.txt 还是根 CMakeLists.txt 中执行到“mylib”的链接?
    • 答案将是主观的,但我喜欢将依赖项列表(包括或库)保持在需要它的目标附近。反之亦然,在 test 目录之外,没有什么可能关心测试,所以把它放在你的测试定义附近。
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2016-01-15
    相关资源
    最近更新 更多