对gtest中的testing :: internal :: EqFailure的未定义引用

时间:2014-07-18 08:37:05

标签: c++ opencv googletest

我正在尝试使用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
         )

我之前已经完成了这个,并且在一些提交之后它显示了这个错误。为什么不再找到它?

6 个答案:

答案 0 :(得分:11)

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

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

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

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

我检查了标题 - 没有任何内容 - testing::internal::String无处不在。奇怪的参考在哪里?

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

<强> TL; DR

  • 删除并重建使用GTest 1.6标头构建的所有旧对象。 (std::string或其他相关的东西,YMMV)
  • 升级GMock,如果你没有。
  • 只使用捆绑的GTest(来自GMock),如果你还没有。

答案 1 :(得分:6)

与接受的解决方案相比,这可能不太可能成为问题,但在我的情况下,我得到了与OP相同的错误,因为使用g ++ - 5编译gtest与g ++ - 4.8在我的项目上正在尝试编译,结果是symbols not being found

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

在这里,我提供另一种情况,可能是这种链接错误的原因:

在我的项目中,出于某种兼容性原因,我必须使用宏“ -D_GLIBCXX_USE_CXX11_ABI = 0”来编译我的项目,这将迫使编译器使用旧的C ++ 11 ABI进行编译(在GCC> 5.0中)。但是,所使用的gtest库是以前编译的,并且直接编译而没有该选项。

最后我遇到了类似的错误,但是test :: 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 :(得分:1)

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

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

它对我有用,值得一试〜

答案 5 :(得分:0)

我和@ 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'

************************************************************************************

我遵循了建议,链接器错误消失了。