2014-07-18 11 views
5

Próbuję zrobić test dla funkcji przy użyciu GoogleTest teraz nie jest już znalezieniem się EqFailurerzecz:nieokreślone odniesienie do testowania :: wewnętrzny :: EqFailure w numeru 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)' 

piszę test tak:

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

I korzystam z OpenCV i w razie potrzeby opublikuję inne pliki.

CMake plik jest tutaj:

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 
     ) 

Zrobiłem to na wile temu, a po kilku zobowiązuje to wyświetla ten błąd. Dlaczego go już nie znajduje?

+0

Czy możesz spróbować uruchomić swoją kompilację w pełnym zakresie i sprawdzić, czy istnieje opcja katalogu z linkami '-L' do katalogu zawierającego biblioteki gtest? Czy łączysz statycznie lub dynamicznie? Błąd występuje w czasie połączenia (nie w czasie wykonywania), prawda? – NicholasM

+0

To się dzieje w czasie połączenia, tak. Połączyłem go dynamicznie – sop

+1

Czy powinien to być 'Gtest_LIBRARIES' zamiast' GTEST_LIBRARIES'? Nie jestem zbyt zaznajomiony z cmake, ale podstawową ideą jest to, że cmake powinien wygenerować '-lgtest' w linii poleceń i możliwe' -L/path/to/gtest'. Czy widzisz, czy jest to część linii poleceń linku? Możliwe: http://stackoverflow.com/questions/8507723/how-to-start-working-with-test-and-cmake – NicholasM

Odpowiedz

10

miałem dokładnie ten komunikat o błędzie w następujący scenariusz:

Korzystanie bałagan Ubuntu 14.10 (który ma rozbieżności między libgtest-dev (numeru GTEST 1,6) i google-mock (GMock 1.7 z dołączane numeru GTEST 1,7), I wybrałeś złą ścieżkę - zainstalowano GMock 1.6, aby pasował do systemu libgtest-dev).

Przez pewien czas projekt został skompilowany, ale potem - po użyciu polecenia git zastosowano kilka nowych funkcji wersji 1.7 i musiałem zaktualizować do wersji 1.7. Zainstalowałem go z pakietu google-mock (przebudowałem przy użyciu CMake, a następnie skopiowałem do /usr/include i /usr/lib). Następnie uruchomiłem kompilację, a plik gtest.h: 1337 (czy to nie jest ten numer wiersza?) Zaczął się błąd linkera.

Po godzin inspekcji nm -C libgtest.a z bibliotekami (powtórz dla libgtest_main.a, libgmock.a i libgmock_main.a), okazało się, że funkcja testing::internal::EqFailure wykonuje 2x std::string, nie testing::internal::String. !!

Sprawdziłem nagłówki - nic tam - std::string wszędzie. Gdzie było to dziwne odniesienie?

Cóż - było to w starych plikach obiektowych, zbudowanych z nagłówków GTest 1.6! Więc teraz:

TL; DR

  • Wyjąć i odbudować wszystkie stare przedmioty które zbudowane z numeru GTEST 1,6 nagłówków. (make clean, lub coś podobnego do tego, YMMV)
  • Uaktualnij GMocka, jeśli go nie masz.
  • Używaj tylko dołączonego GTest (z GMock), jeśli go nie masz.
+0

Czy to zadziałało? Właściwie przeszedłem do testu wzmocnienia, używam boost, nie? :) – sop

3

Mój przypadek był podobny do pierwszej odpowiedzi, zamierzałem zbudować test google ze źródeł i połączyć go z aplikacją. Ale zainstalowałem pakiet gtest-dev w systemie i zapomniałem poprawnie ustawić ścieżki dołączania. Po usunięciu pakietu gtest-dev i ustawieniu ścieżki dołączania problem zniknął. Odpowiedź Tomasza bardzo pomogła w rozwiązaniu problemu.

+0

Pracowałem też dla mnie, właśnie usunięto program gtest-dev z systemu. – Konstantin

4

Prawdopodobnie jest to mniej prawdopodobne, że jest to problem w porównaniu z przyjętym rozwiązaniem, ale w moim przypadku otrzymałem ten sam błąd co OP z powodu użycia g ++ - 5 do kompilacji gtest vs. g ++ - 4.8 w projekcie, który Próbowałem skompilować, co zaowocowało symbols not being found.

Jeśli zaakceptowana odpowiedź nie działa dla Ciebie, prawdopodobnie powinieneś dwukrotnie sprawdzić, czy użyłeś tego samego kompilatora dla swojego projektu, co gtest.

+0

Sprawdź również, czy używasz tej samej biblioteki standardowej co gtest (np. LibstdC++ zamiast libC++ w zależności od tego, jak zbudowałeś gtest). – meowsqueak

Powiązane problemy