Domanda

Ho un file di test semplice, TestMe.cpp:

#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.)

I può 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

Funziona come previsto.

Tuttavia, non posso ottenere questo per 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" relativi alle funzioni GTEST.

sto tirando i capelli fuori qui, come io sono sicuro che è qualcosa di semplice. Tutte le idee?

Ecco alcuni dei simboli esterni che non sono definite:

TestMe.obj:-1: error:  unresolved external symbol "public: int __thiscall testing::UnitTest::Run(void)" (?Run@UnitTest@testing@@QAEHXZ) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "public: static class testing::UnitTest * __cdecl testing::UnitTest::GetInstance(void)" (?GetInstance@UnitTest@testing@@SAPAV12@XZ) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "void __cdecl testing::InitGoogleTest(int *,char * *)" (?InitGoogleTest@testing@@YAXPAHPAPAD@Z) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "public: __thiscall testing::internal::AssertHelper::~AssertHelper(void)" (??1AssertHelper@internal@testing@@QAE@XZ) referenced in function "private: virtual void __thiscall MyTest_SomeTest_Test::TestBody(void)" (?TestBody@MyTest_SomeTest_Test@@EAEXXZ)
È stato utile?

Soluzione

Non ho mai potuto ottenere questo lavoro come una libreria statica, ma che funzioni come una DLL.

Per prima cosa, ho dovuto costruire Google prova come DLL. Non ho avuto alcun successo ottenere questo al lavoro in Visual Studio, quindi ho solo usato 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 $@ $^ -Wl,--out-implib,gtest_dll.lib

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

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

  • Definisci GTEST_LINKED_AS_SHARED_LIBRARY = 1
  • Imposta un riferimento di libreria a uno o gtest_dll.lib 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 di esempio pro Qt sulla base di quella che ho questo è lavoro (finalmente!):

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

Altri suggerimenti

sto usando Qt + GTEST / gmock senza problemi. Ho appena provato tutte le possibili combinazioni di assoluti / percorsi relativi con diversi tagli, ma non riuscivo a riprodurre il problema. Hai controllato il contenuto della variabile "LIBS" dal Makefile.Debug generato da qmake?

Ecco qualche pezzo generico di consiglio: non utilizzare percorsi assoluti, perché il codice non viene compilato su altre macchine dalla propria, a meno che non si scaricarlo exacly stessa posizione (che potrebbe non essere possibile a causa di configurazione Qt differente, etc.). Utilizzare i percorsi relativi, invece, anche per 3rd librerie partito.

I mantenere le librerie 3a parte nel sistema di controllo di versione (si utilizza uno, giusto?). Ho una directory "3rdparty" e per ogni progetto che utilizza queste librerie, aggiungo svn: puntamento esterno alla versione esplicitamente specificato del 3 lib partito. L'ultima parte è importante, perché assicura che sarete in grado di costruire ogni revisione del progetto, anche quando si aggiorna libreria di terze parti.

Penso che si sono ok per il file qmake. Ma perché è INCLUDEPATH assoluta e relativa LIBS. Vorrei provare a impostare LIBS assoluta anche.

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

Ma qual è il problema principale è (credo) è necessario mettere slash in INCLUDEPATH. Nella documentazione è come questo.

INCLUDEPATH += C:/gtest-1.5.0/gtest-1.5.0/include
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top