Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake:将GTest添加到构建中_C++_Cmake_Googletest - Fatal编程技术网

C++ CMake:将GTest添加到构建中

C++ CMake:将GTest添加到构建中,c++,cmake,googletest,C++,Cmake,Googletest,我正试图使用FetchContent模块将googletest添加到我的构建中,但我遇到了许多不完全的答案,并且一直无法得到我想要的结果。使用ExternalProject模块的过时示例似乎过多,但使用FetchContent模块的有用示例却很少 以下是我今天浏览过的不完整的参考文献列表: 以下是我要使用的文件结构: -root -build -googletest-build -googletest-src -googletest-tes

我正试图使用FetchContent模块将googletest添加到我的构建中,但我遇到了许多不完全的答案,并且一直无法得到我想要的结果。使用ExternalProject模块的过时示例似乎过多,但使用FetchContent模块的有用示例却很少

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

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

-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中,并且我相当有信心我知道如何将它与我想要使用的test exe链接。我遇到的主要问题是使用FetchContent模块将testgtest.cpp构建为可执行文件,并将其与googletest链接。它一直无法构建,其失败的具体原因根本不明显

root/CMakeLists.txt

src/CMakeLists.txt

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

test/CMakeLists.txt

对于A使用FetchContent模块将googletest添加到我的构建中,B将我的测试可执行文件与googletest链接起来,我不清楚我应该在这里具体做什么

test/testgtest.cpp

在testgtest.cpp中具体应该包含什么并不明显,但我在我所看到的示例中看到了,所以我认为这是一种迟钝、神秘的魔法,应该是有效的

以下是我所看到的结果:

$ 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:\root\build\_deps\googletest-src\googletest\include\gtest/internal/gtest-port.h(996,34): error C2220:  warning treated as error - no 'object' file generated [D:\root\build\_deps\googletest-build\googletest\gtest.vcxproj]
D:\root\build\_deps\googletest-src\googletest\include\gtest/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:\root\build\_deps\googletest-build\googletest\gtest.vcxproj]
警告C4996将继续重复,直到结束

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


感谢阅读

您的问题似乎不在于cmake本身,而在于您似乎遇到了Visual Studio的说明。在另一个平台上可能会有所不同。你可以,但显然这并不总是可能的,甚至可能不是一个很好的解决方案

至于警告本身,它似乎是,甚至是固定的,但尽管线程可能指向他们试图合并它,但是

无论如何,另一种可能的解决方法是,如警告所述:


但同样,这只是一个解决办法。它最终仍然需要得到修复,但这显然取决于他们来修复它。

您的问题似乎不在于cmake本身,而在于您似乎遇到了Visual Studio的说明。在另一个平台上可能会有所不同。你可以,但显然这并不总是可能的,甚至可能不是一个很好的解决方案

至于警告本身,它似乎是,甚至是固定的,但尽管线程可能指向他们试图合并它,但是

无论如何,另一种可能的解决方法是,如警告所述:

但同样,这只是一个解决办法。它最终仍然需要修复,但显然这取决于他们来修复它。

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

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

由于问题似乎源于1.8.0版,其中包含一些未合并到其他版本中的bug,因此我认为必须有一个更新的googletest版本,我可以在我的CMake文件中引用该版本来解决此问题

瞧,在从1.8.0版开始撰写本文件时,仅将其更改为1.10.0版,就解决了我的这个具体问题:

test/CMakeLists.txt

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

test/CMakeLists.txt

我也测试了这一点,并且我能够在删除这些行的情况下构建我的测试运行程序。

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

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

由于问题似乎源于1.8.0版,其中包含一些未合并到其他版本中的bug,因此我认为必须有一个更新的googletest版本,我可以在我的CMake文件中引用该版本来解决此问题

瞧,在从1.8.0版开始撰写本文件时,仅将其更改为1.10.0版,就解决了我的这个具体问题:

test/CMakeLists.txt

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

test/CMakeLists.txt


我也对此进行了测试,并且我能够在删除这些行的情况下构建我的测试运行程序。

解决了您的问题吗?还有,关于这个问题,还有。长话短说:看起来它以前是固定的,但从未合并。所以它是固定的,你只是发布了错误的版本?不管怎样,很高兴它对你有用。你可能想把它写进一个答案,但你确实想
不必。是的,那件事最终解决了这个问题,真是太滑稽了。真不敢相信我昨天没想到!谢谢你的帮助。你的问题解决了吗?还有,关于这个问题,还有。长话短说:看起来它以前是固定的,但从未合并。所以它是固定的,你只是发布了错误的版本?不管怎样,很高兴它对你有用。你可能想把它放在一个答案中,但你不必。是的,这很滑稽,最终解决了这个问题。真不敢相信我昨天没想到!谢谢你的帮助谢谢你的信息。当我今天有更多的时间时,我将使用你给我的。我想我能够解决我看到的问题,但这个答案并不能解决它。然而,它确实把我推向了正确的方向,所以你绝对应该为此投上一票。我将更新我的OP,以包括解决问题的方法,因为这很滑稽,我希望其他人也会因为过时的教程而遇到同样的问题。谢谢你提供的信息。当我今天有更多的时间时,我将使用你给我的。我想我能够解决我看到的问题,但这个答案并不能解决它。然而,它确实把我推向了正确的方向,所以你绝对应该为此投上一票。我将更新我的OP,以包括为我解决问题的内容,因为这很滑稽,我希望其他人会因为过时的教程而遇到同样的问题。为了完整性起见:此解决方案适用于CMake 3.14版以后的版本。模块的文档还描述了与CMake 3.11版兼容的替代方案。请参阅my,以获取逐步指南。为了完整性起见:此解决方案适用于CMake 3.14版以后的版本。模块的文档还描述了与CMake 3.11版兼容的替代方案。请参阅我的手册,以获得一个逐步的指南。
# 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})
# 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)
#include "gtest/gtest.h"

TEST(sample_test_case, sample_test)
{
    EXPECT_EQ(1, 1);
}
$ 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:\root\build\_deps\googletest-src\googletest\include\gtest/internal/gtest-port.h(996,34): error C2220:  warning treated as error - no 'object' file generated [D:\root\build\_deps\googletest-build\googletest\gtest.vcxproj]
D:\root\build\_deps\googletest-src\googletest\include\gtest/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:\root\build\_deps\googletest-build\googletest\gtest.vcxproj]
#define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING  1
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.10.0
)
set(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
set(BUILD_GTEST ON CACHE BOOL "" FORCE)