我正在尝试使用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
)
我之前已经完成了这个,并且在一些提交之后它显示了这个错误。为什么不再找到它?
答案 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.a
,libgmock.a
和libgmock_main.a
),我发现testing::internal::EqFailure
函数需要2x { {1}},而不是std::string
。!!
我检查了标题 - 没有任何内容 - testing::internal::String
无处不在。奇怪的参考在哪里?
嗯 - 它是在旧的目标文件中,使用GTest 1.6标头构建!所以现在:
<强> TL; DR 强>
std::string
或其他相关的东西,YMMV)答案 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'
************************************************************************************
我遵循了建议,链接器错误消失了。