【问题标题】:How to compile GoogleTest tests efficiently in separate subdirectory in CMake?如何在 CMake 的单独子目录中有效地编译 GoogleTest 测试?
【发布时间】:2022-08-17 23:18:49
【问题描述】:

我在理解如何有效地将测试引入项目方面存在问题。我有代码,编译为ProjectMain 可执行文件,我想为它编写测试(编译为ProjectTest 可执行文件)。我想将测试与ProjectMain 的代码分开,所以文件结构如下:

Project
  include
    foo_class.h
  src
    foo_class.cpp
    main.cpp
  test
    include
    src
      foo_class_test.cpp
      <\"gtest_main\" is used, so no \"main.cpp\" here>
    CMakeLists.txt
  CMakeLists.txt

我如何将这两个 CMakeLists.txt 相互关联,以便每一个源文件只编译一次(当ProjectMainProjectTest 都被编译时)?更准确地说,让ProjectTest 了解foo_class 实施的最佳方式是什么?

我可以将ProjectMain\ 的源添加到ProjectTest 目标,但这基本上意味着重新编译ProjectMain。更好的选择是将后者分成两部分:一个库,它包含它的所有代码库,以及一个仅具有main 函数的虚拟可执行文件。然后ProjectTest 只会链接到库,但我更愿意将ProjectMain 构建到单个文件中(仅限可执行文件)。

那么还有其他选择吗?或者,也许我错过了什么?也许我可以以某种方式指出ProjectTest 需要ProjectMain\ 的来源的CMake?

  • 更好的选择就是最好的选择。

标签: c++ cmake googletest


【解决方案1】:

查看 CMake 的 Object Libraries

我个人从未使用过它们(我个人使用您提到的库和仅具有main 函数的可执行文件的方法)但我认为这就是您正在寻找的。基本上只需将源文件编译成对象以便稍后链接。

【讨论】:

    【解决方案2】:

    在您的 cmakelists.txt 中,您可以定义 2 个可执行文件: add_executable(ProjectMain ${COMMON_SRC} ${ProjectMain_SRC} ) add_executable(ProjectTest ${COMMON_SRC} ${ProjectTest_SRC} ) 之前要定义 ProjectMain_SRC 和 ProjectTest_SRC,如下所示:

    list(APPEND ProjectMain_SRC file_1 file_2 ...)

    COMMON_SRC 列表包含两个可执行文件使用的文件

    【讨论】:

      猜你喜欢
      • 2021-03-12
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      相关资源
      最近更新 更多