2016-10-25 2 views
1

Ich möchte GTest verwenden und bekam das Beispiel zu arbeiten. Jetzt möchte ich meinen eigenen Code testen, bekomme aber ein Verknüpfungsproblem.GTest Linking Fehler: undefinierter Verweis auf 'foo :: Funktion'

Ich habe auf Stackoverflow suchen, und ein ähnliches Problem gefunden, aber die Antworten haben mir nicht geholfen, mein Problem zu beheben.

Meine Dateien sind:

CMakeLists.txt

cmake_minimum_required(VERSION 2.6) 

SET(CMAKE_CXX_FLAGS "-std=gnu++11") 

# Locate GTest 
find_package(GTest REQUIRED) 
include_directories(${GTEST_INCLUDE_DIRS}) 
file(GLOB files 
    Datahandler.h 
    Datahandler.cpp 
    ) 

# Link runTests with what we want to test and the GTest and pthread library 
add_executable(runTests tests.cpp ${files}) 
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread) 

tests.cpp

#include "DataHandler.h" 
#include <gtest/gtest.h> 

TEST(checkFilled, All){ 
    DataHandler handler("loc", "prot", 1); 
    handler.filledElement[1] = 1; 
    ASSERT_EQ(1, handler.checkFilled(1)); 
    ASSERT_EQ(0, handler.checkFilled(2)); 
    ASSERT_EQ(1, handler.checkFilled(8)); 
    ASSERT_EQ(0, handler.checkFilled(9)); 
} 

int main(int argc, char **argv) { 
    testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

Die Fehler, die ich bekommen sind:

CMakeFiles/runTests.dir/tests.cpp.o: In function `checkFilled_All_Test::TestBody()': 
tests.cpp:(.text+0x121): undefined reference to `DataHandler::DataHandler(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char)' 
tests.cpp:(.text+0x172): undefined reference to `DataHandler::checkFilled(unsigned char)' 
tests.cpp:(.text+0x271): undefined reference to `DataHandler::checkFilled(unsigned char)' 
tests.cpp:(.text+0x382): undefined reference to `DataHandler::checkFilled(unsigned char)' 
tests.cpp:(.text+0x48d): undefined reference to `DataHandler::checkFilled(unsigned char)' 
collect2: error: ld returned 1 exit status 
CMakeFiles/runTests.dir/build.make:95: recipe for target 'runTests' failed 
make[2]: *** [runTests] Error 1 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/runTests.dir/all' failed 
make[1]: *** [CMakeFiles/runTests.dir/all] Error 2 
Makefile:83: recipe for target 'all' failed 
make: *** [all] Error 2 

Ich bin mir fast sicher, dass es etwas mit Include- oder Linkproblem zu tun hat, aber ich finde die richtige Syntax nicht.

Antwort

0

Es gibt mehrere Punkte in Ihrem CMake Projekt:

SET(CMAKE_CXX_FLAGS "-std=gnu++11") 

Wenn CMAKE_CXX_FLAGS verwendet wird, ist es eine gute Praxis nicht vorherigen Wert zu löschen:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") 

Standardmäßig ist der Wert leer ist, damit sollte sich hier nichts ändern. Wie dem auch sei, zu verlangen, C 11 ++, können Sie prüfen, statt CMAKE_CXX_STANDARD:

SET(CMAKE_CXX_STANDARD 11) 
SET(CMAKE_CXX_STANDARD_REQUIRED ON) 

Next:

file(GLOB files 
    Datahandler.h 
    Datahandler.cpp 
    ) 

Wenn Sie GLOB, sollten Sie Dateimuster passieren, keine Pfade Datei. Wie auch immer, aus dem doc:

We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.

Betrachten set statt:

set(files 
    Datahandler.h 
    Datahandler.cpp 
    ) 

Next:

include_directories(${GTEST_INCLUDE_DIRS}) 

#... 

target_link_libraries(runTests ${GTEST_LIBRARIES} pthread) 

Statt altmodischen ${GTEST_LIBRARIES}, können Sie prüfen, imported targets:

target_link_libraries(runTests GTest::Main) 

GTest::Main werden Verzeichnisse über das importierte Ziel umfassen, so dass Sie include_directories nicht aufrufen müssen. Darüber hinaus wird eine Abhängigkeit zu einer Thread-Bibliothek hinzugefügt, so dass ich ziemlich sicher bin, dass Sie pthread entfernen können (zu testen). Schließlich enthält GTest::Main eine grundlegende Implementierung der Hauptfunktion, die genau das tut, was Sie getan haben, damit Sie Ihre entfernen können.

Beachten Sie, dass Sie benötigen, um die minimal erforderliche Version von CMake Upgrade auf Ziele voll availables machen importiert:

cmake_minimum_required(VERSION 2.8.11) 

So Ihre CMake Projekt im Jahr 2016 aussehen soll:

cmake_minimum_required(VERSION 2.8.11) 

SET(CMAKE_CXX_STANDARD 11) 
SET(CMAKE_CXX_STANDARD_REQUIRED ON) 

set(files 
    Datahandler.h 
    Datahandler.cpp 
    ) 

# Locate GTest 
find_package(GTest REQUIRED) 

# Link runTests with what we want to test and the GTest library 
add_executable(runTests tests.cpp ${files}) 

target_link_libraries(runTests GTest::Main) 

Und test.cpp:

#include "DataHandler.h" 
#include <gtest/gtest.h> 

TEST(checkFilled, All){ 
    DataHandler handler("loc", "prot", 1); 
    handler.filledElement[1] = 1; 
    ASSERT_EQ(1, handler.checkFilled(1)); 
    ASSERT_EQ(0, handler.checkFilled(2)); 
    ASSERT_EQ(1, handler.checkFilled(8)); 
    ASSERT_EQ(0, handler.checkFilled(9)); 
} 
Verwandte Themen