【问题标题】:Do you only need to build the googletest library once?您只需要构建一次 googletest 库吗?
【发布时间】:2015-06-03 13:47:24
【问题描述】:

首先,我是测试框架的新手,对 C++ 也比较陌生,但我正试图围绕 GoogleTest 展开思考。我正在使用 Windows 机器,运行“Git for Windows”(MSYS)和 MinGW,同时使用 Sublime Text 作为我的代码编辑器。我使用 make 作为我的构建工具,尽管我对 cmake 及其跨平台关注的了解越多,我想知道是否应该切换到让 cmake 为我创建 makefile。 (这可能是另一个问题)

我一直在努力理解 GoogleTest 源代码包的确切用途。我意识到我需要将源代码构建到库中,然后在编译测试时包含它,但是我应该如何去做呢? Google 包含一个 cmake 构建脚本,可生成用于构建的 env/compiler 特定的 makefile。我应该使用这个吗?我觉得如果我这样做并且它盲目地起作用,那么引擎盖下发生的很多事情都会让我不知所措。自述文件并没有解决我的问题,因为它暗示我每次希望运行它们时都应该构建库和我的测试。库不应该是一个只需要编译一次的独立存档吗?我很困惑,我确信这是我的错,但如果有人为我阐明这个过程,我将不胜感激。

【问题讨论】:

  • 如果您有一个 CMake 项目,只需将其添加为子项目并与其余项目一起构建(CMake 应确保在不需要时不会重新构建它)。否则只需构建一次并像使用任何其他库一样使用静态库。

标签: c++ cmake makefile static-libraries googletest


【解决方案1】:

您应该记住,如果您不更改 gtest 源代码中的任何内容,ma​​ke 将不会重建 gtest

以下是我使用 cmake 和 gtest 进行单元测试的方法。

您可以通过将 gtest 源代码添加为根 CMakeLists.txt 文件中的子目录来添加它。

add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/gtest ${CMAKE_CURRENT_BINARY_DIR}/gtest)
include_directories(${CMAKE_SOURCE_DIR}/thirdparty/gtest/include ${CMAKE_SOURCE_DIR}/thirdparty/gtest)

我的应用程序由包含用于单元测试的测试文件夹的各个模块组成。我有以下样板循环将每个测试添加到全局范围。

file(GLOB TEST_SRC_FILES *.cpp) 
foreach(TEST_SRC_PATH ${TEST_SRC_FILES})
 #get filename of your test without extension
 get_filename_component(TEST_NAME ${TEST_SRC_PATH} NAME_WE)

 add_executable(${TEST_NAME} ${TEST_NAME})

 #here you link the test executable with gtest
 target_link_libraries(${TEST_NAME} gtest  gtest_main)

 #-----------------------------
 # you can link here your test to external libraries
 #-----------------------------

 add_test(${TEST_NAME} ${TEST_NAME})

 #this is a list of all tests
 set(PROJECT_TEST_NAMES ${PROJECT_TEST_NAMES} ${TEST_NAME})  
endforeach()

 #This assigns the list of tests to a property. This make the list available from the root scope.
 get_property(UNIT_TESTS GLOBAL PROPERTY UNIT_TESTS)
 set(UNIT_TESTS ${UNIT_TESTS} ${PROJECT_TEST_NAMES})
 set_property(GLOBAL PROPERTY UNIT_TESTS ${UNIT_TESTS} )

最后,在根范围内,我添加了一个名为 check 的自定义目标,它在我的单元测试中运行 ctest。

#-----------------------------
# Running unit tests
#-----------------------------
get_property(UNIT_TESTS GLOBAL PROPERTY UNIT_TESTS)
if(DEFINED UNIT_TESTS)
    add_custom_target(check COMMAND ctest -VV
                             DEPENDS ${UNIT_TESTS})
endif()

当我运行make check 时,它会运行所有模块的单元测试,而make 无需测试即可编译。

【讨论】:

  • 我不熟悉 cmake 语法,但我想我知道这里发生了什么,这似乎是一个不错的解决方案。你会推荐使用cmake吗?我最初使用 make 来构建我的项目。
  • cmake 用于生成项目,make 是实际构建项目的工具。它们是用于不同目的的工具,因此无法比较。 Cmake 生成你需要使用 make 编译代码的 makefile。
  • 我明白,但我目前的解决方案是硬编码一个makefile,你会建议通过cmake生成一个吗?
  • 我会研究为什么我应该这样做^^感谢所有的帮助。
猜你喜欢
  • 2011-12-11
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2016-11-02
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多