gpt4 book ai didi

c++ - gtest 中对 testing::internal::EqFailure 的 undefined reference

转载 作者:可可西里 更新时间:2023-11-01 18:04:53 31 4
gpt4 key购买 nike

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

/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
)

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

最佳答案

我在以下情况下收到了这条错误消息:

使用困惑的 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 检查库数小时后(重复 libgtest_main.alibgmock.alibgmock_main.a),我发现 testing::internal::EqFailure 函数需要 2x std::string,而不是 testing: :internal::String.!!

我检查了 header - 那里什么都没有 - std::string 无处不在。奇怪的引用在哪里?

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

长话短说

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

关于c++ - gtest 中对 testing::internal::EqFailure 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24820664/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com