2014-07-18 18 views
5

Sto cercando di fare un test per una funzione tramite un GoogleTest ora non sta trovando più il EqFailurecosa:undefined reference to test :: :: interna EqFailure in 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)' 

sto scrivendo il test come questo:

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 sto usando OpenCV e, se necessario, posterò gli altri file.

CMake file è qui:

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 
     ) 

ho fatto un Wile fa, e dopo qualche commit Si tratta di visualizzazione di questo errore. Perché non lo trova più?

+0

Puoi provare a eseguire la tua build in modo verosimile e vedere se c'è una opzione di directory '-L' nella directory contenente le tue librerie gtest? Stai collegando staticamente o dinamicamente? L'errore si verifica al momento del collegamento (non al runtime), corretto? – NicholasM

+0

Succede al momento del collegamento, sì. L'ho collegato dinamicamente – sop

+1

Dovrebbe essere 'Gtest_LIBRARIES' invece di' GTEST_LIBRARIES'? Non ho molta familiarità con cmake, ma l'idea di base è che cmake dovrebbe generare un '-lgtest' sulla riga di comando, e possibile un' -L/path/to/gtest'. Riesci a vedere se questo è parte della riga di comando del collegamento? Forse pertinente: http://stackoverflow.com/questions/8507723/how-to-start-working-with-gtest-and-cmake – NicholasM

risposta

10

che ho avuto esattamente questo messaggio di errore nel seguente scenario:

Utilizzando un disordinato Ubuntu 14.10 (che ha una mancata corrispondenza tra libgtest-dev (GTEST 1.6), e google-mock (GMock 1.7 con in bundle GTEST 1.7), I scelto il percorso sbagliato - installato GMock 1.6, per abbinare il sistema libgtest-dev).

Per qualche tempo il progetto è stato compilato, ma poi, dopo un lancio di git, sono state utilizzate alcune nuove funzionalità di 1.7 e ho dovuto effettuare l'aggiornamento a 1.7. L'ho installato dal pacchetto google-mock (ricostruito con CMake, quindi copiato in /usr/include e /usr/lib). Quindi, ho avviato la build e gtest.h: 1337 (non è questo numero di linea che dice?) L'errore del linker è iniziato.

Dopo ore di ispezionare le librerie con nm -C libgtest.a (ripetere per libgtest_main.a, libgmock.a e libgmock_main.a), ho scoperto che la funzione testing::internal::EqFailure prende 2x std::string, e non testing::internal::String. !!

Ho controllato le intestazioni - niente lì - std::string ovunque. Dov'era lo strano riferimento?

Bene - era nei vecchi file oggetto, costruito con le intestazioni GTest 1.6! Così ora:

TL; DR

  • Rimuovere e ricostruire tutti i vecchi oggetti che hai costruito con GTEST 1,6 intestazioni. (make clean, o qualcosa del genere, YMMV)
  • Upgrade GMock, se non è necessario.
  • Utilizzare solo GTest in bundle (da GMock), in caso contrario.
+0

Questo ha funzionato per te? In realtà sono passato al boost test, io uso boost, no? :) – sop

3

Il mio caso era simile alla prima risposta, intendevo creare test di Google da fonti e collegarlo all'applicazione. Ma avevo il pacchetto gtest-dev installato nel sistema e ho dimenticato di impostare correttamente i percorsi di inclusione. Dopo aver rimosso il pacchetto gtest-dev e aver impostato il percorso di inclusione, il problema è scomparso. La risposta di Tomasz ha aiutato molto a restringere il problema.

+0

Ha funzionato anche per me, ho rimosso gtest-dev dal sistema. – Konstantin

4

Probabilmente questo è meno probabile che sia il problema rispetto alla soluzione accettata, ma nel mio caso ho avuto lo stesso errore dell'OP a causa dell'uso di g ++ - 5 per compilare gtest vs. g ++ - 4.8 sul progetto che Stavo cercando di compilare, che ha provocato symbols not being found.

Se la risposta accettata non funziona per voi allora probabilmente dovreste controllare due volte di aver usato lo stesso compilatore per il vostro progetto come gtest.

+0

Controlla anche che stai usando la stessa libreria standard di gtest (ad es. LibstdC++ piuttosto che libC++ a seconda di come hai creato gtest). – meowsqueak

Problemi correlati