使用 GTest 的 CMake 无法正常工作

Rob*_*inW 4 c++ cmake googletest

我试图使用 googletest 设置 CMake C++ 项目。我对 CMake 并没有真正的经验并使用过这个指南来创建我自己的设置。

\n\n

当尝试构建项目时,编译器会抛出错误:

\n\n
.../test.cpp:12:5: error: \xe2\x80\x98EXPECT_THAT\xe2\x80\x99 was not declared in this scope\n     EXPECT_THAT(a, ContainerEq(b));\n     ^~~~~~~~~~~\n.../test.cpp:12:5: note: suggested alternative: \xe2\x80\x98EXPECT_GT\xe2\x80\x99\n     EXPECT_THAT(a, ContainerEq(b));\n     ^~~~~~~~~~~\n     EXPECT_GT\n../test.cpp:13:31: error: \xe2\x80\x98ContainerEq\xe2\x80\x99 is not a member of \xe2\x80\x98testing\xe2\x80\x99\n     EXPECT_THAT(a, ::testing::ContainerEq(b)); // doesn\'t work either\n
Run Code Online (Sandbox Code Playgroud)\n\n

不过 GTest 的某些部分似乎工作正常。如果我注释掉第二个测试,一切都会正常。

\n\n

文件夹结构:

\n\n
    \n
  • CMakeLists.txt
  • \n
  • 测试/\n\n
      \n
    • CMakeLists.txt
    • \n
    • gtest.cmake
    • \n
    • 测试.cpp
    • \n
  • \n
\n\n

顶级 CMakeLists.txt

\n\n
cmake_minimum_required (VERSION 3.8)\nproject (TestProject)\nenable_testing()\nadd_subdirectory(test)\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试/CMakeLists.txt

\n\n
include(gtest.cmake)\nadd_executable(UnitTests test.cpp)\ntarget_link_libraries(UnitTests libgtest)\nadd_test(NAME AllUnitTests COMMAND UnitTests)\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试/gtest.cmake

\n\n
find_package(Threads REQUIRED)\n\n# Enable ExternalProject CMake module\ninclude(ExternalProject)\n\n# Download and install GoogleTest\nExternalProject_Add(\n    gtest\n    URL https://github.com/google/googletest/archive/master.zip\n    PREFIX ${CMAKE_CURRENT_BINARY_DIR}/gtest\n    # Disable install step\n    INSTALL_COMMAND ""\n)\n\n# Get GTest source and binary directories from CMake project\nExternalProject_Get_Property(gtest source_dir binary_dir)\n\n# Create a libgtest target to be used as a dependency by test programs\nadd_library(libgtest IMPORTED STATIC GLOBAL)\nadd_dependencies(libgtest gtest)\n\n# Set libgtest properties\nset_target_properties(libgtest PROPERTIES\n    "IMPORTED_LOCATION" "${binary_dir}/googlemock/gtest/libgtest.a"\n    "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}"\n)\n\n# Create a libgmock target to be used as a dependency by test programs\nadd_library(libgmock IMPORTED STATIC GLOBAL)\nadd_dependencies(libgmock gtest)\n\n# Set libgmock properties\nset_target_properties(libgmock PROPERTIES\n    "IMPORTED_LOCATION" "${binary_dir}/googlemock/libgmock.a"\n    "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}"\n)\n\n# I couldn\'t make it work with INTERFACE_INCLUDE_DIRECTORIES\ninclude_directories("${source_dir}/googletest/include"\n                    "${source_dir}/googlemock/include")\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试/测试.cpp

\n\n
#include <vector>\n#include "gtest/gtest.h"\n\nTEST(SampleTest, Equal){\n    EXPECT_EQ(42, 42);\n}\n\nTEST(ContainerComparison, Equal){\n    const std::vector<int> a(2, 1);\n    const std::vector<int> b(2, 1);\n\n    EXPECT_THAT(a, ContainerEq(b));\n    EXPECT_THAT(a, ::testing::ContainerEq(b)); // doesn\'t work either\n}\n\nint main(int argc, char** argv){\n    ::testing::InitGoogleTest(&argc, argv);\n    int ret = RUN_ALL_TESTS();\n    return ret;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Iva*_*rop 9

匹配器是 GMock 的一部分。您需要包含它(并链接到它的库)。

#include <gmock/gmock.h>
Run Code Online (Sandbox Code Playgroud)

GMock 曾经是一个独立的库,现在已合并到 GoogleTest 存储库中。然而它有单独的包含和库。

您正在关注的教程是 2014 年的。您可以在GoogleTest GitHub 存储库中找到不错的最新教程。