web-dev-qa-db-fra.com

Gtest: Références non définies

J'essaie d'utiliser GoogleTest pour tester une fonction simple, mais lorsque j'exécute make dans mon dossier de construction, le compilateur lance Undefined Reference messages d'erreur sur moi. J'ai référencé le fichier d'en-tête gtest, donc je ne suis pas sûr de ce qui ne va pas. Des idées? Je suis nouveau sur tout le sujet des tests unix et unitaires, donc je pourrais très bien manquer quelque chose de simple. Merci d'avance!

Messages d'erreur:

CMakeFiles/Proj2.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x1e): undefined reference to `testing::InitGoogleTest(int*, char**)'
main.cpp:(.text+0x23): undefined reference to `testing::UnitTest::GetInstance()'
main.cpp:(.text+0x2b): undefined reference to `testing::UnitTest::Run()'
collect2: error: ld returned 1 exit status

main.cpp

#include "gtest/gtest.h"

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

Test.cpp

#include "gtest/gtest.h"
#include "Testable.h"

TEST(GetTwoTest, Two) {
    EXPECT_EQ(2, GetTwo());
}

Testable.cpp

#include "Testable.h"

int GetTwo() {
    return 3;
}

Voici mon fichier CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

SET(CMAKE_CXX_FLAGS "-std=gnu++11") #Turn on C++11 Support

set(FILES_TO_TEST Testable.cpp)
set(UNIT_TESTS Test.cpp)
set(MAIN_FILE main.cpp)

add_subdirectory(gtest) #Build all the gtest stuff
include_directories(gtest/include)
include_directories(.)
add_library(codeToTest ${FILES_TO_TEST})

add_executable(Proj2 ${MAIN_FILE})
target_link_libraries(Proj2 codeToTest)

add_executable(unit-test ${UNIT_TESTS})
target_link_libraries(unit-test gtest gtest_main rt pthread codeToTest)
19
Vance

Votre configuration semble être presque correcte. Cependant, vous devez disposer de 2 fonctions main distinctes; un pour l'exécutable réel Proj2 et un autre avec le gtest inclut et fonctions pour l'exécutable de test unit-test.

Vous pouvez le faire en ayant 2 fichiers main.cpp différents, par exemple main.cpp et test_main.cpp. Celui que vous avez montré serait test_main.cpp et serait inclus dans le add_executable(unit-test ... commande.

Votre nouveau main.cpp n'aurait aucune référence à gtest, ni à des fonctions ni à des fonctions.

11
Fraser

Des erreurs de l'éditeur de liens, il est évident que vous n'avez pas lié la bibliothèque gtest à votre programme de test.

Voir Primer :

Pour écrire un programme de test à l'aide de Google Test, vous devez compiler Google Test dans une bibliothèque et lier votre test à celle-ci. ...

Consultez ce document pour plus de détails sur votre compilateur et votre système.

4
PiotrNycz