您是否只需要构建一次googletest库? 首先我是测试框架的新手,对于C++来说是比较新的,但是我想把我的头放在GooGestEt上。我在Windows机器上工作,运行“Git for Windows”(MSYS)和MinGW,同时使用Sublime文本作为代码编辑器。我使用make作为构建工具,尽管我对cmake及其跨平台关注点了解得越多,我想知道是否应该转而让cmake为我创建makefile。(这可能是另一个问题)

您是否只需要构建一次googletest库? 首先我是测试框架的新手,对于C++来说是比较新的,但是我想把我的头放在GooGestEt上。我在Windows机器上工作,运行“Git for Windows”(MSYS)和MinGW,同时使用Sublime文本作为代码编辑器。我使用make作为构建工具,尽管我对cmake及其跨平台关注点了解得越多,我想知道是否应该转而让cmake为我创建makefile。(这可能是另一个问题),c++,cmake,makefile,static-libraries,googletest,C++,Cmake,Makefile,Static Libraries,Googletest,我很难理解的是Google测试源代码包到底该怎么办。我意识到我需要将源代码构建到库中,然后在编译测试时将其包括在内,但是我应该如何进行呢?Google包括一个cmake构建脚本,该脚本生成用于构建的特定于环境/编译器的makefile。我应该用这个吗?我觉得如果我这样做了,它会盲目地起作用,很多在引擎盖下发生的事情都会在我的头上发生。自述文件并没有消除我的问题,因为它意味着每次我希望运行库和测试时,我都应该构建库和测试。库不应该是只需要编译一次的独立存档吗?我很困惑,我肯定这是我的错,但如果有人

我很难理解的是Google测试源代码包到底该怎么办。我意识到我需要将源代码构建到库中,然后在编译测试时将其包括在内,但是我应该如何进行呢?Google包括一个cmake构建脚本,该脚本生成用于构建的特定于环境/编译器的makefile。我应该用这个吗?我觉得如果我这样做了,它会盲目地起作用,很多在引擎盖下发生的事情都会在我的头上发生。自述文件并没有消除我的问题,因为它意味着每次我希望运行库和测试时,我都应该构建库和测试。库不应该是只需要编译一次的独立存档吗?我很困惑,我肯定这是我的错,但如果有人能为我解释一下这个过程,我将不胜感激。

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

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

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

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应确保不会重新构建)。否则只需构建一次,然后像使用其他库一样使用静态库。我不熟悉cmake语法,但我认为我看到了这里发生的事情,这似乎是一个不错的解决方案。你会推荐使用cmake吗?我最初使用make来构建我的项目。cmake用于生成项目,make是实际构建项目的工具。它们是用于不同目的的工具,因此无法进行比较。Cmake生成使用make编译代码所需的makefiles。我了解这一点,但我当前的解决方案是硬编码makefile,您是否建议通过Cmake生成一个makefile?我将研究为什么要这样做^^^感谢所有帮助。