2010-05-06 4 views
8

Ho un semplice file di prova, TestMe.cpp:Test Con Google da Qt in Windows

#include <gtest/gtest.h> 

TEST(MyTest, SomeTest) { 
    EXPECT_EQ(1, 1); 
} 

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

Ho Google prova costruito come una libreria statica. (Posso fornire il makefile se è rilevante.)

posso compilare TestMe.cpp da una riga di comando senza alcun problema:

g++ TestMe.cpp -IC:\gtest-1.5.0\gtest-1.5.0\include -L../gtest/staticlib -lgtest -o TestMe.exe 

viene eseguito come previsto.

Tuttavia, non riesco a farlo compilare in Qt. Il mio file di progetto Qt, nella stessa directory:

SOURCES += TestMe.cpp 
INCLUDEPATH += C:\gtest-1.5.0\gtest-1.5.0\include 
LIBS += -L../gtest/staticlib -lgtest 

Questo si traduce in 17 errori "simbolo esterno non risolto" legati alla GTEST funzioni.

Mi sto strappando i capelli, sono sicuro che è qualcosa di semplice. Qualche idea?

Ecco alcuni dei simboli esterni che sono indefiniti:

TestMe.obj:-1: error: unresolved external symbol "public: int __thiscall testing::UnitTest::Run(void)" ([email protected]@[email protected]@QAEHXZ) referenced in function _main 
TestMe.obj:-1: error: unresolved external symbol "public: static class testing::UnitTest * __cdecl testing::UnitTest::GetInstance(void)" ([email protected]@[email protected]@[email protected]) referenced in function _main 
TestMe.obj:-1: error: unresolved external symbol "void __cdecl testing::InitGoogleTest(int *,char * *)" ([email protected]@@[email protected]) referenced in function _main 
TestMe.obj:-1: error: unresolved external symbol "public: __thiscall testing::internal::AssertHelper::~AssertHelper(void)" ([email protected]@[email protected]@[email protected]) referenced in function "private: virtual void __thiscall MyTest_SomeTest_Test::TestBody(void)" ([email protected][email protected]@EAEXXZ) 
+0

Un elenco di simboli esterni sarebbe d'aiuto. – Michael

+0

@ Michael: alcuni dei simboli non risolti sono ora inclusi nella domanda. Se hai qualche idea, fammi sapere. –

risposta

6

Non ho mai potuto farlo funzionare come una libreria statica, ma funziona come una DLL.

In primo luogo, ho dovuto creare Google Test come DLL. Non ho avuto successo nel far funzionare tutto in Visual Studio, quindi ho usato solo mingw32-make.È possibile utilizzare il Makefile fornito nella fonte, apportando le seguenti modifiche:

gtest-all.o : $(GTEST_SRCS_) 
    $(CXX) $(CPPFLAGS) -DGTEST_CREATE_SHARED_LIBRARY=1 -I$(GTEST_DIR) $(CXXFLAGS) -c \ 
      $(GTEST_DIR)/src/gtest-all.cc 

gtest_main.o : $(GTEST_SRCS_) 
    $(CXX) $(CPPFLAGS) -DGTEST_CREATE_SHARED_LIBRARY=1 -I$(GTEST_DIR) $(CXXFLAGS) -c \ 
      $(GTEST_DIR)/src/gtest_main.cc 

gtest.dll : gtest-all.o 
    $(CXX) -shared -o [email protected] $^ -Wl,--out-implib,gtest_dll.lib 

gtest_main.dll : gtest-all.o gtest_main.o 
    $(CXX) -shared -o [email protected] $^ -Wl,--out-implib,gtest_main_dll.lib 

Poi, quando si compila il progetto di prova, è necessario:

  • Definire GTEST_LINKED_AS_SHARED_LIBRARY = 1
  • Impostare un riferimento di libreria su gtest_dll.lib o gtest_main_dll.lib.
  • Incolla gtest.dll o gtest_main.dll nella stessa directory del file eseguibile.

(La mia comprensione è che si utilizza gtest_main solo se non sta fornendo la propria funzione main().)

Ecco un file pro campione Qt sulla base di quella che ho questo è (finalmente!) funzionante:

DEFINES += GTEST_LINKED_AS_SHARED_LIBRARY=1 
SOURCES += main.cpp MyClassTests.cpp 
INCLUDEPATH += ../path/to/gtest/includes 
LIBS += -L../path/to/gtest/libraries -lgtest_dll \ 
    -L../ClassLibrary/bin -lMyClass 
CONFIG += console 
+0

Grazie mille per questo !. L'ho fatto anche con Qt5, mingw4.7.2 e gtest 1.6.0. Non avevo bisogno di definire GTEST_LINKED_AS_SHARED_LIBRARY = 1 e invece di -lgtest_dll, ho fatto -lgtest. Si noti inoltre che il Makefile contiene anche un obiettivo per creare un programma di esempio, questo rompe con le modifiche di cui sopra (invece di fare gtest.dll) – Thirler

+0

Puoi spiegare: MyClassTests.cpp contiene la seconda funzione principale (per i test)? Ho issus con due funzioni principali nella creazione di http://stackoverflow.com/questions/37765182/multiple-main-delcaration-in-qtcreator-project-which-uses-googletest E cosa è ClassLibrary e ClassLibrary/bin dir? – Vyacheslav

0

Penso che tu sia ok per il file qmake. Ma perché INCLUDEPATH è assoluto e LIBS relativo. Proverei anche a impostare LIBS in assoluto.

Da qui http://doc.trolltech.com/4.6/qmake-variable-reference.html#includepath

Ma qual è il problema principale è (credo) è necessario mettere avanti slash in INCLUDEPATH. Nei documenti è così.

INCLUDEPATH += C:/gtest-1.5.0/gtest-1.5.0/include 
+0

Buona idea da provare, ma non è stato d'aiuto. Ho provato tutte le combinazioni di relativo, assoluto, anche usando la funzione '$$ quote', ma ho sempre gli stessi errori. –

+0

http://doc.trolltech.com/4.6/qmake-variable-reference.html#libs Vedere la nota su Windows. provare con: -L ../ gtest/staticlib/libgtest.lib (o qualunque sia il nome) – pastjean

+0

È stato eseguito nuovamente qmake dopo aver modificato il file? – pastjean

3

Sto usando Qt + gtest/gmock senza problemi. Ho appena testato tutte le possibili combinazioni di percorsi assoluti/relativi con diverse barre, ma non sono riuscito a riprodurre il problema. Hai controllato il contenuto della variabile "LIBS" da Makefile.Debug generato da qmake?

Ecco alcuni consigli generici: non utilizzare alcun percorso assoluto, perché il codice non verrà compilato su altre macchine rispetto al proprio, a meno che non lo si scarichi in una stessa posizione (che potrebbe non essere possibile a causa a diverse configurazioni Qt, ecc.). Utilizza invece percorsi relativi, anche per le librerie di terze parti.

Conservo le librerie di terze parti nel sistema di controllo versione (ne usi uno, vero?). Ho una directory "3rdparty" e per ogni progetto che usa queste librerie, aggiungo svn: la proprietà esterna che punta alla versione esplicitamente specificata di lib di terze parti. L'ultima parte è importante, perché garantisce che sarai in grado di costruire ogni revisione del tuo progetto, anche quando aggiorni la libreria di terze parti.

+0

Buon consiglio. Ciò che descrivi sopra (percorsi relativi, svn) è essenzialmente ciò che usiamo qui. (Anche se non stiamo sfruttando svn: external.) Avrei dovuto preoccuparmi delle ristrutturazioni dopo averlo fatto funzionare. Il Makefile.Debug sembra OK. Sei su Windows? Perché tutto sta funzionando bene su Linux ... Sto avendo problemi solo su Windows. –

+0

Sì, Windows XP, Qt 4.6.2 – chalup

+0

Potresti incollare il tuo file di progetto qmake? Hai creato gtest e gmock eseguendo mingw32-make in entrambe le directory 'make'? – brunoqc