2010-05-06 14 views
8

Tengo un archivo de prueba simple, TestMe.cpp:Uso de prueba de Google Qt en 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(); 
} 

he construido Google prueba como una biblioteca estática. (Puedo proporcionar el makefile si es relevante.)

puedo compilar TestMe.cpp desde una línea de comandos sin ningún problema:

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

Se ejecuta como se esperaba.

Sin embargo, no puedo hacer que compile en Qt. Mi archivo de proyecto Qt, en el mismo directorio:

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

Esto se traduce en 17 errores "símbolo externo sin resolver" relacionados con GTEST funciones.

Estoy tirando de mi cabello aquí, ya que estoy seguro de que es algo simple. ¿Algunas ideas?

Éstos son algunos de los símbolos externos no definidos:

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

Una lista de los símbolos externos ayudaría. – Michael

+0

@Michael: algunos de los símbolos no resueltos se han incluido ahora en la pregunta. Si tienes alguna idea, házmelo saber. –

Respuesta

6

Nunca pude hacer que esto funcione como una biblioteca estática, pero funciona como una DLL.

Primero, tuve que construir Google Test como una DLL. No tuve ningún éxito al hacer que esto funcionara en Visual Studio, así que acabo de usar mingw32-make.Se puede utilizar el Makefile proporcionado en la fuente, por lo que los siguientes cambios:

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 

Entonces, al compilar el proyecto de prueba, debe:

  • Definir GTEST_LINKED_AS_SHARED_LIBRARY = 1
  • Establecer una referencia de la biblioteca a gtest_dll.lib o gtest_main_dll.lib.
  • Pegue gtest.dll o gtest_main.dll en el mismo directorio que su ejecutable.

(Mi entendimiento es que utiliza gtest_main sólo si usted no está proporcionando a su propia función main().)

Aquí es un archivo pro Qt muestra basada en la que tengo esto es (por fin!) trabajando:

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

¡Muchas gracias por esto !. También hice esto con Qt5, mingw4.7.2 y gtest 1.6.0. No necesité definir GTEST_LINKED_AS_SHARED_LIBRARY = 1 y en lugar de -lgtest_dll, hice -lgtest. También tenga en cuenta que el Makefile también contiene un objetivo para construir un programa de ejemplo, esto se rompe por los cambios anteriores (en su lugar, solo haga gtest.dll) – Thirler

+0

¿Puede explicarme por qué: MyClassTests.cpp contiene la segunda función principal (para pruebas)? Tengo issus con dos funciones principales en la compilación http://stackoverflow.com/questions/37765182/multiple-main-delcaration-in-qtcreator-project-which-uses-googletest ¿Y qué es ClassLibrary & ClassLibrary/bin dir? – Vyacheslav

0

Creo que están bien para su archivo qmake. Pero ¿Por qué es INCLUDEPATH absoluto y LIBS relativo? Intentaría también establecer LIBS absoluto.

Desde aquí http://doc.trolltech.com/4.6/qmake-variable-reference.html#includepath

Pero cuál es el problema principal es (creo) que necesita para poner barras inclinadas en INCLUDEPATH. En los documentos es así.

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

Buena idea para probar, pero no ayudó. He intentado todas las combinaciones de relativo, absoluto, incluso utilizando la función '$$ quote', pero sigue siendo el mismo error. –

+0

http://doc.trolltech.com/4.6/qmake-variable-reference.html#libs Consulte la nota en Windows. prueba con: -L ../ gtest/staticlib/libgtest.lib (o el nombre que sea) – pastjean

+0

¿Ha vuelto a ejecutar qmake después de cambiar el archivo? – pastjean

3

Estoy usando Qt + gtest/gmock sin ningún problema. Acabo de probar todas las combinaciones posibles de rutas absolutas/relativas con barras diagonales diferentes, pero no pude reproducir su problema. ¿Ha comprobado el contenido de la variable "LIBS" de Makefile.Debug generado por qmake?

Aquí hay algunos consejos genéricos: no use rutas absolutas, porque su código no se compilará en otras máquinas que no sean las suyas, a menos que las descargue exactamente en la misma ubicación (lo que podría no ser posible debido a a diferentes configuraciones de Qt, etc.). Use rutas relativas en su lugar, también para libs de terceros.

Guardo las bibliotecas de terceros en el sistema de control de versiones (utiliza uno, ¿verdad?). Tengo un directorio "3rdparty" y para cada proyecto que usa esas libs, agrego svn: propiedad externa que apunta a una versión explícitamente especificada de 3rd party lib. La última parte es importante, ya que asegura que podrá construir cada revisión de su proyecto, incluso cuando actualice la biblioteca de terceros.

+0

. Un buen consejo. Lo que usted describe arriba (rutas relativas, svn) es esencialmente lo que usamos aquí. (Aunque no estamos aprovechando svn: external.) Iba a preocuparme por la reestructuración después de que funcionara. Makefile.Debug se ve bien. ¿Estás en Windows? Porque todo está funcionando bien en Linux ... solo estoy teniendo problemas en Windows. –

+0

Sí, Windows XP, Qt 4.6.2 – chalup

+0

¿Podría pegar el archivo del proyecto qmake? ¿Construiste gtest y gmock ejecutando mingw32-make en ambos directorios 'make'? – brunoqc