2014-07-18 13 views
5

tôi đang cố gắng để làm một thử nghiệm cho một chức năng sử dụng GoogleTest một bây giờ nó không được tìm nữa các EqFailuređiều:tài liệu tham khảo không xác định để thử nghiệm :: nội :: EqFailure trong gtest

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

Tôi viết các thử nghiệm như thế này:

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]); 
    } 
    } 
} 

tôi đang sử dụng OpenCV và nếu cần, tôi sẽ đăng các tệp khác.

CMake tập tin là ở đây:

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 
     ) 

Tôi đã làm điều này một mưu chước trước, và sau khi một số cam kết nó được hiển thị lỗi này. Tại sao nó không còn tìm thấy điều đó?

+0

Bạn có thể thử chạy xây dựng một cách chi tiết và xem liệu có tùy chọn thư mục liên kết '-L' đến thư mục chứa thư viện gtest của bạn không? Bạn đang liên kết tĩnh hay động? Lỗi xảy ra tại thời gian liên kết (không phải thời gian chạy), đúng không? – NicholasM

+0

Điều đó xảy ra vào thời gian liên kết, vâng. Tôi đã liên kết nó động – sop

+1

Nếu nó là 'Gtest_LIBRARIES' thay vì' GTEST_LIBRARIES'? Tôi không quá quen thuộc với cmake, nhưng ý tưởng cơ bản là cmake sẽ tạo ra '-lgtest' trên dòng lệnh và có thể là' -L/path/to/gtest'. Bạn có thể xem liệu đó có phải là một phần của dòng lệnh liên kết của bạn không? Có thể có liên quan: http://stackoverflow.com/questions/8507723/how-to-start-working-with-gtest-and-cmake – NicholasM

Trả lời

10

Tôi đã có chính xác thông báo lỗi này trong các tình huống sau:

Sử dụng một lộn xộn Ubuntu 14.10 (trong đó có một không phù hợp giữa libgtest-dev (GTest 1.6), và google-mock (GMock 1,7 với gói GTest 1.7), tôi chọn sai đường dẫn - cài đặt GMock 1.6, để phù hợp với hệ thống libgtest-dev).

Trong một thời gian dự án được biên soạn, nhưng sau đó - sau khi kéo git, một số tính năng mới 1.7 đã được sử dụng và tôi cần nâng cấp lên 1.7. Tôi đã cài đặt nó từ gói google-mock (được xây dựng lại với CMake, sau đó được sao chép sang /usr/include/usr/lib). Sau đó, tôi đã khởi chạy bản dựng và số liên kết gtest.h: 1337 (không phải là số này cho biết?) Đã xảy ra lỗi liên kết.

Sau giờ kiểm tra việc libs với nm -C libgtest.a (lặp lại cho libgtest_main.a, libgmock.alibgmock_main.a), tôi phát hiện ra rằng testing::internal::EqFailure hàm lấy 2x std::string, và không testing::internal::String. !!

Tôi đã kiểm tra tiêu đề - không có gì ở đó - std::string ở mọi nơi. Tham chiếu kỳ lạ ở đâu?

Vâng - nó nằm trong các tệp đối tượng cũ, xây dựng với tiêu đề GTest 1.6! Vì vậy, bây giờ:

TL; DR

  • Remove và xây dựng lại tất cả các đối tượng cũ mà bạn xây dựng với GTest 1.6 tiêu đề. (make clean hoặc một cái gì đó có hiệu lực đó, YMMV)
  • Nâng cấp GMock, nếu bạn chưa có.
  • Chỉ sử dụng GTest đi kèm (từ GMock), nếu bạn chưa có.
+0

Điều này có phù hợp với bạn không? Trên thực tế tôi đã vượt qua để tăng cường kiểm tra, tôi sử dụng tăng, không? :) – sop

3

Trường hợp của tôi tương tự như câu trả lời đầu tiên, tôi dự định xây dựng kiểm tra google từ các nguồn và liên kết nó với ứng dụng. Nhưng tôi đã cài đặt gói gtest-dev trong hệ thống và quên đặt đường dẫn bao gồm chính xác. Sau khi gỡ bỏ gói gtest-dev và thiết lập đường dẫn include, vấn đề đã biến mất. Câu trả lời từ Tomasz đã giúp rất nhiều để thu hẹp vấn đề.

+0

Làm việc cho tôi quá, chỉ cần loại bỏ gtest-dev khỏi hệ thống. – Konstantin

4

Có lẽ điều này ít có khả năng là vấn đề so với giải pháp được chấp nhận, nhưng trong trường hợp của tôi, tôi gặp lỗi tương tự như OP do sử dụng g ++ - 5 để biên dịch gtest so với g ++ - 4.8 trên dự án Tôi đã cố gắng biên dịch, kết quả là symbols not being found.

Nếu câu trả lời được chấp nhận không hoạt động cho bạn thì có thể bạn nên kiểm tra kỹ xem bạn đã sử dụng cùng một trình biên dịch cho dự án của bạn dưới dạng gtest hay chưa.

+0

Ngoài ra, hãy kiểm tra bạn đang sử dụng cùng một thư viện chuẩn như gtest (ví dụ: libstdC++ thay vì libC++ tùy thuộc vào cách bạn đã tạo gtest). – meowsqueak

Các vấn đề liên quan