CMake:将GTest添加到构建中



我正试图使用FetchContent模块将googletest添加到我的构建中,但我遇到了许多部分答案,无法到达我想要的位置。使用ExternalProject模块的过时示例似乎过多,但使用FetchContent模块的有用示例却很少。

以下是我今天浏览的不完整的参考文献列表:

  • https://crascit.com/2015/07/25/cmake-gtest/
  • https://github.com/bast/gtest-demo
  • https://github.com/google/googletest/blob/master/googletest/README.md#incorporating-转化为现有的cmake项目
  • https://cmake.org/cmake/help/latest/module/FetchContent.html#declaring-内容详细信息
  • 如何开始使用GTest和CMake

下面是我想要使用的文件结构:

-root
-build
-googletest-build
-googletest-src
-googletest-test
-src
-test
-src
-CMakeLists.txt
-AllOfMySourceFiles
-test
-CMakeLists.txt
-testgtest.cpp
-CMakeLists.txt

以下是我试图用来构建的命令:

cmake ..
cmake --build .

到目前为止,我能够将我所有的源文件链接到我想要的dll中,并且我很有信心知道如何将其与我想要使用的测试exe链接。我遇到的主要问题是使用FetchContent模块将testgtest.cpp构建为可执行文件,并将其与谷歌测试链接。它一直无法构建,失败的具体原因一点也不明显。

root/CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_FLAGS_RELEASE "/MT")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
set(CMAKE_CXX_STANDARD 11)
set(LIBNAME "WTP")
set(TESTNAME "TestRunner")
set(LIB_MAJOR_VERS "0")
set(LIB_MINOR_VERS "0")
set(LIB_PATCH_VERS "0")
#build source
project(${LIBNAME} 
VERSION  ${LIB_MAJOR_VERS}.${LIB_MINOR_VERS}.${LIB_PATCH_VERS})
add_subdirectory(src)
#build tests
project(${TESTNAME})
add_subdirectory(test)
enable_testing()
add_test(${TESTNAME} ${TESTNAME})

src/CMakeLists.txt

# Build output setup
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/bin)
#get all of the source files
set(SRCS Export.c
Regions/ReferenceConstants.h
Regions/Region1.h
Regions/Region2.h
Regions/Region3.h
Regions/Boundaries/RegionBoundaries/R2andR3.h
Regions/Boundaries/SubregionBoundaries/Region3/Boundaries_vTP.h)
add_library(${LIBNAME} SHARED ${SRCS})

到目前为止,这个正在按我的意愿工作。

测试/CMakeLists.txt

# Build output setup
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/bin)
################################
# GTest
################################
project(googletest-git NONE)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG        release-1.8.0
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
set(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
set(BUILD_GTEST ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
################################
# Tests
################################
# Add test cpp file
add_executable(${TESTNAME} testgtest.cpp)
# Link test executable against gtest & gtest_main
target_link_libraries(${TESTNAME} gtest gtest_main)

我不清楚我应该在这里具体做什么:A(使用FetchContent模块将谷歌测试添加到我的构建中B(将我的测试可执行文件与谷歌测试链接。

test/testgtest.cpp

#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}

testgtest.cpp中,我应该是什么#include并不明显,但我在我看到的例子中看到了这一点,所以我认为这是一些迟钝的、神秘的魔法,只是应该起作用。

以下是我所看到的输出:

$ cmake --build .
Microsoft (R) Build Engine version 16.2.32702+c4012a063 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
gtest-all.cc
D:rootbuild_depsgoogletest-srcgoogletestincludegtest/internal/gtest-port.h(996,34): error C2220:  warning treated as error - no 'object' file generated [D:rootbuild_depsgoogletest-buildgoogletestgtest.vcxproj]
D:rootbuild_depsgoogletest-srcgoogletestincludegtest/internal/gtest-port.h(996,34): warning C4996:  'std::tr1': warning STL4002: The non-Standard std::tr1 namespace and TR1-only machinery are deprecated and will be REMOVED. You can define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING to acknowledge that you have received this warning. [D:rootbuild_depsgoogletest-buildgoogletestgtest.vcxproj]

warning C4996将继续令人恶心地重复,直到它结束。

我确实想从git中获取谷歌测试,那么我需要做些什么才能成功地构建和使用谷歌测试呢?

感谢阅读

这就是我解决问题的原因。

感谢Chipster对这个问题进行了更多的研究,并最终将我推向了正确的方向。

由于这个问题似乎源于1.8.0版本,其中包含一些没有合并到其他版本中的错误,我认为一定有一个更新的谷歌测试版本,我可以在我的CMake文件中引用它来解决这个问题。

瞧,只有将其从1.8.0版本更改为.10.0版本(在撰写本文时最新(,才为我解决了这个特定的问题:

测试/CMakeLists.txt

FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG        release-1.10.0
)

对于那些想知道删除以下行是否适用于此解决方案和场景的人,这样您就可以构建googlemock&谷歌测试:

测试/CMakeLists.txt

set(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
set(BUILD_GTEST ON CACHE BOOL "" FORCE)

我也测试了这一点,我能够在去掉这些线的情况下构建我的测试跑步者。

您的问题似乎不是cmake本身,而是遇到了一个被视为错误的警告(Visual Studio的说明。在另一个平台上可能有所不同(。你可以关闭这个设置,但显然这并不总是可能的,甚至可能不是一个很好的解决方案。

至于警告本身,它似乎是已知的,甚至是固定的,但可能从未正确合并(尽管线程可能指向他们试图合并它,但错误似乎仍然存在(。

无论如何,另一种可能的解决方法是将宏定义为警告所说的:

#define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING  1

但这只是一个变通方法。它最终仍然需要修复,但这显然取决于他们来修复它

最新更新