【问题标题】:undefined reference to testing::internal::EqFailure in gtestgtest 中对 testing::internal::EqFailure 的未定义引用
【发布时间】:2014-09-09 08:03:14
【问题描述】:

我正在尝试使用 GoogleTest 对函数进行测试,但现在它不再找到 EqFailure 事物

/usr/include/gtest/gtest.h:1337: undefined reference to `testing::internal::EqFailure(char const*, char const*, testing::internal::String const&, testing::internal::String const&, bool)'

我正在编写这样的测试:

test_file.cpp

#include <gtest/gtest.h>

#include "tools/CMorphology.hpp"

TEST(erode_Morph, crossKernel_Morph)
{
  // initialize matrix to be eroded
  cv::Mat matrix = (cv::Mat_<uchar>(5, 5) << 1, 1, 1, 1, 1,
                                             1, 1, 0, 1, 1,
                                             1, 1, 1, 1, 1,
                                             1, 0, 1, 1, 1,
                                             1, 1, 1, 1, 1
            );
  // initialize the cross kernel
  cv::Mat kernel = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 3));
  // initialize the vector expected as output
  cv::Mat verMat = (cv::Mat_<uchar>(5, 5) << 1, 1, 0, 1, 1,
                                             1, 0, 0, 0, 1,
                                             1, 0, 0, 1, 1,
                                             0, 0, 0, 1, 1,
                                             1, 0, 1, 1, 1);

  // call erode(...)
  Morphology morphology;
  cv::Mat matrixOut;
  morphology.erode(matrix, kernel, matrixOut);

  for (int i = 0; i < matrixOut.rows; i++)
  {
    for (int j = 0; j < matrixOut.rows; j++)
    {
      EXPECT_EQ(matrixOut.ptr<uchar>(i)[j], verMat.ptr<uchar>(i)[j]);
    }
  }
}

我正在使用 OpenCV,如果需要,我会发布其他文件。

CMake 文件在这里:

cmake_minimum_required(VERSION 2.8)

set(EXECUTABLE_NAME lpdetect)
project(${EXECUTABLE_NAME})

option(DEBUG "Display images for each step" OFF)

if (DEBUG)
        set(CMAKE_CXX_FLAGS "-g -Wall -Wno-unknown-pragmas -Wno-reorder -Wno-sign-compare -Wno-switch -std=gnu++11 -DDISPLAY_IMGS -DBOOST_LOG_DYN_LINK")
else()
        set(CMAKE_CXX_FLAGS "-g -Wall -Wno-unknown-pragmas -Wno-reorder -Wno-sign-compare -Wno-switch -std=gnu++11 -DBOOST_LOG_DYN_LINK")
endif()

find_package(OpenCV REQUIRED core
                             imgproc
                             features2d
                             nonfree
                             highgui
                             )

find_package(Boost REQUIRED COMPONENTS filesystem
                                       program_options
                                       system
                                       thread
                                       locale
                                       regex
                                       date_time
                                       log
                                       log_setup
                                       timer
                                       )

include_directories(src/main/cpp
                    ${Boost_INCLUDE_DIRS}
                    ${OpenCV2_INCLUDE_DIRS}
                    )

add_executable( ${EXECUTABLE_NAME}
                             src/main/cpp/main.cpp
# and the other files
                             )

target_link_libraries(${EXECUTABLE_NAME} ${OpenCV_LIBS}
                                         "-laws-cpp"
                                         "-lcasablanca"
                                         ${Boost_LIBRARIES}
                                         "-lcrypto"
                                         )


find_package(GTest REQUIRED gtest_main
                            pthread)

enable_testing()

include_directories( ${GTEST_INCLUDE_DIRS} )

add_executable(${EXECUTABLE_NAME}_test src/test/cpp/test_Morphology.cpp
                                       src/main/cpp/tools/CMorphology.cpp
                                       src/main/cpp/tools/CMorphology.hpp
                       )

target_link_libraries(${EXECUTABLE_NAME}_test
                                       ${OpenCV_LIBRARIES}
                                       ${Boost_LIBRARIES}
                                       ${GTEST_LIBRARIES}
                                       )

add_test(${EXECUTABLE_NAME}_test
         ${EXECUTABLE_NAME}_test
         )

我很久以前就做过这个,在一些提交之后它显示了这个错误。为什么它不再发现?

【问题讨论】:

  • 您可以尝试详细运行您的构建,并查看包含您的 gtest 库的目录是否有 -L 链接目录选项?你是静态链接还是动态链接?错误发生在链接时(不是运行时),对吗?
  • 它发生在链接时,是的。我动态链接了它
  • 应该是Gtest_LIBRARIES 而不是GTEST_LIBRARIES?我对cmake不太熟悉,但基本思想是cmake应该在命令行上生成一个-lgtest,并且可能生成一个-L/path/to/gtest。你能看看这是否是你的链接命令行的一部分吗?可能相关:stackoverflow.com/questions/8507723/…

标签: c++ opencv googletest


【解决方案1】:

在以下情况下,我确实收到了此错误消息:

使用凌乱的 Ubuntu 14.10(在 libgtest-dev (GTest 1.6) 和 google-mock(GMock 1.7 与捆绑的 GTest 1.7)之间不匹配),我选择了错误的路径 - 安装了 GMock 1.6,以匹配系统的 @ 987654323@).

项目编译了一段时间,但是在 git pull 之后,使用了 1.7 的一些新功能,我需要升级到 1.7。我从 google-mock 包安装它(用 CMake 重建,然后复制到 /usr/include/usr/lib)。然后,我启动了构建,gtest.h:1337(这不是行号说明吗?)链接器错误开始发生。

在使用nm -C libgtest.a(重复libgtest_main.alibgmock.alibgmock_main.a)检查库数小时后,我发现testing::internal::EqFailure 函数需要2x std::string,而不是testing::internal::String。! !

我检查了标题 - 那里什么都没有 - std::string 到处都是。奇怪的参考在哪里?

嗯 - 它在旧的目标文件中,使用 GTest 1.6 头文件构建!所以现在:

TL;DR

  • 删除并重建您使用 GTest 1.6 标头构建的所有旧对象。 (make clean,或者类似的东西,YMMV)
  • 如果您还没有升级 GMock,请升级。
  • 如果没有,请仅使用捆绑的 GTest(来自 GMock)。

【讨论】:

  • 这对您有用吗?其实我已经通过了boost测试,我用boost,不是吗? :)
【解决方案2】:

与公认的解决方案相比,这可能不太可能是问题,但在我的情况下,由于在我的项目上使用 g++-5 编译 gtest 与 g++-4.8,我得到了与 OP 相同的错误试图编译,导致symbols not being found

如果接受的答案对您不起作用,那么您可能应该仔细检查您的项目是否使用了与 gtest 相同的编译器。

【讨论】:

  • 还要检查您是否使用与 gtest 相同的标准库(例如 libstdc++ 而不是 libc++,具体取决于您构建 gtest 的方式)。
  • 对我来说就是这样。使用 gcc 4.9 构建 gtest 并使用 gcc-8 构建我的项目。我回去使用“CC=gcc-8 CXX=/usr/bin/g++-8 cmake ../ && make && sudo make install”构建 gtest,它成功了。
【解决方案3】:

这里我提供了另一种情况,可能是导致此类链接错误的原因:

在我的项目中,出于某种兼容性原因,我必须使用宏“-D_GLIBCXX_USE_CXX11_ABI=0”编译我的项目,这会强制编译器使用旧的 C++11 ABI 进行编译(在 GCC>5.0 中)。但是使用的gtest库是之前编译过的,直接编译没有这个选项。

最后我得到了一个类似的错误,但是 testing::internal::EqFailure 的函数签名就像“testing::internal::EqFailure(char const*, char const*, std::__cxx11::string const&, std::__cxx11::string const&, bool)”。我不太记得确切的签名,但字符串 args 中有类似“__cxx11”的东西,而不是 std::string。当我找到它时,我发现这可能是由我使用的那个宏引起的。

所以这个问题最终通过使用“-D_GLIBCXX_USE_CXX11_ABI=0”重新编译gtest然后链接新库来解决。

希望这个答案可能对某人有所帮助。

【讨论】:

    【解决方案4】:

    我和@yizhi-wang 有同样的问题。这也与@tomasz-gandor 和@tim-rae 的问题非常相似:字符串类型在不同的gtest 构建中有所不同,这通常是由GCC 4 和5 之间发生的std::string ABI 中断引起的。

    就我而言,当发出conan install 命令时,我注意到以下警告文本:

    ************************* WARNING: GCC OLD ABI COMPATIBILITY ***********************
    
    Conan detected a GCC version > 5 but has adjusted the 'compiler.libcxx' setting to
    'libstdc++' for backwards compatibility.
    Your compiler is likely using the new CXX11 ABI by default (libstdc++11).
    
    If you want Conan to use the new ABI, edit the default profile at:
    
        /home/john/.conan/profiles/default
    
    adjusting 'compiler.libcxx=libstdc++11'
    
    ************************************************************************************
    

    我听从了建议,链接器错误消失了。

    【讨论】:

    • 同样使用柯南 - 使用 conan profile update settings.compiler.libcxx=libstdc++11 default 更新配置文件成功了。
    • 非常感谢。这也是我的情况,它为我解决了!
    【解决方案5】:

    我的情况与第一个答案类似,我打算从源代码构建谷歌测试并将其链接到应用程序。但是我在系统中安装了 gtest-dev 包,忘记正确设置包含路径。 删除 gtest-dev 包并设置包含路径后,问题就消失了。 Tomasz 的回答有助于缩小问题范围。

    【讨论】:

    • 也为我工作,刚刚从系统中删除了 gtest-dev。
    • 这里也一样,更新 gmock 和删除 libgtest-dev 有帮助。
    【解决方案6】:

    我的情况:对 ASSERT_STREQ(...) 的未定义声明

    解决方案:用BUILD_GMOCK == OFF重建gtest

    对我有用,值得一试~

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多