Cómo configurar Google C ++ Testing Framework (gtest) con Visual Studio 2005

82

No está documentado en el sitio web y la gente parece tener problemas para configurar el marco. ¿Alguien puede mostrar una introducción paso a paso para una configuración de proyecto de muestra?

knaser
fuente
Me alegro de que alguien pregunte ...
Boyang

Respuestas:

44

Lo que dijo Arlaharen fue básicamente correcto, excepto que omitió la parte que explica los errores del enlazador. En primer lugar, debe crear su aplicación sin el CRT como biblioteca de tiempo de ejecución. Siempre debe hacer esto de todos modos, ya que realmente simplifica la distribución de su aplicación. Si no hace esto, entonces todos sus usuarios necesitan tener instalada la biblioteca en tiempo de ejecución de Visual C ++, y los que no lo hagan se quejarán de que faltan misteriosas DLL en su sistema ... por los cientos de kilobytes adicionales que cuesta vincular el CRT estáticamente, te ahorras muchos dolores de cabeza más adelante en el apoyo (confía en mí en este caso, ¡lo he aprendido de la manera difícil!).

De todos modos, para hacer esto, vaya a las propiedades del destino -> C / C ++ -> Generación de código -> Biblioteca en tiempo de ejecución, y debe configurarse como "Multi-Threaded" para su versión de versión y "Multi-Threaded Debug" para su compilación de depuración.

Dado que la biblioteca gtest se construye de la misma manera, debe asegurarse de que está vinculando con la versión correcta de ella , o de lo contrario el vinculador extraerá otra copia de la biblioteca en tiempo de ejecución, que es el error que vio (por cierto, esto no debería hacer una diferencia si está usando MFC o no). Debe compilar gtest como modo de depuración y lanzamiento y conservar ambas copias. Luego, enlaza con gtest.lib / gtest_main.lib en su versión de lanzamiento y gtestd.lib / gtest_maind.lib en su versión de depuración.

Además, debe asegurarse de que su aplicación apunte al directorio donde se almacenan los archivos de encabezado gtest (en propiedades -> C / C ++ -> General -> Directorios de inclusión adicionales), pero si llegó al error del vinculador, supongo que ya logró corregir esta parte, o de lo contrario tendría que lidiar con muchos más errores del compilador primero.

Nik Reiman
fuente
He aprendido esto de la "manera difícil", pasando todo el día. Finalmente lo hice funcionar, después de construir ambos de la misma manera. Gracias por tu respuesta, pero es tarde. : / Y por cierto, su sugerencia de CRT es incorrecta, pero no tengo suficiente espacio para discutir esto. Ver tinyurl.com/dj5k7k
knaser
Bueno, si lo aprendiste de la "manera difícil", es posible que se te olvide que las dll de tiempo de ejecución de CRT se llaman "redistribuibles" ... así que está claro que tienes que redistribuirlas tú mismo ... ya sea incluyendo el instalador redistribuible en tu propio instalador , o simplemente extrayendo los archivos DLL necesarios en su propia carpeta de instalación ... (incluido un archivo de manifiesto si es necesario)
smerlin
1
Vincular estáticamente el CRT significa que su aplicación no detectará exploits / correcciones de seguridad
paulm
106

(Estas instrucciones hacen que el marco de prueba funcione para la configuración de depuración. Debería ser bastante trivial aplicar el mismo proceso a la configuración de la versión).

Obtenga Google C ++ Testing Framework

  1. Descargue el último marco de gtest
  2. Descomprimir para C:\gtest

Construya las bibliotecas del marco

  1. Abrir C:\gtest\msvc\gtest.slnen Visual Studio
  2. Establecer configuración en "Depurar"
  3. Construir solución

Cree y configure su proyecto de prueba

  1. Cree una nueva solución y elija la plantilla Visual C ++> Win32> Aplicación de consola Win32
  2. Haga clic derecho en el proyecto recién creado y elija Propiedades
  3. Cambie la configuración a depurar.
  4. Propiedades de configuración> C / C ++> General> Directorios de inclusión adicionales: Agregar C:\gtest\include
  5. Propiedades de configuración> C / C ++> Generación de código> Biblioteca en tiempo de ejecución: si su código se vincula a una DLL en tiempo de ejecución, elija DLL de depuración multiproceso (/ MDd). De lo contrario, elija depuración multiproceso (/ MTd).
  6. Propiedades de configuración> Vinculador> General> Directorios de bibliotecas adicionales: agregue C:\gtest\msvc\gtest\Debugo C:\gtest\msvc\gtest-md\Debug, según la ubicación de gtestd.lib
  7. Propiedades de configuración> Vinculador> Entrada> Dependencias adicionales: Agregar gtestd.lib

Verificando que todo funcione

  1. Abra el cpp en su proyecto de prueba que contiene la main()función.
  2. Pega el siguiente código:

    #include "stdafx.h"  
    #include <iostream>
    
    #include "gtest/gtest.h"
    
    TEST(sample_test_case, sample_test)
    {
        EXPECT_EQ(1, 1);
    }
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke
    }
    
  3. Depurar> Iniciar depuración

Si todo funcionó, debería ver aparecer la ventana de la consola y mostrarle los resultados de la prueba unitaria.

mtlynch
fuente
9
¡Fue una gran guía! Pude hacer rodar la pelota, pero agregaría una nota más allí: el proyecto de prueba y la biblioteca gtest deben construirse con la misma opción de generación de código, ambos son / MDd o ambos son / MTd, de lo contrario, habrá ser un montón de errores de vinculación.
Kiril
1
Nota: Quien esté intentando llevar a cabo esta implementación similar con Microsoft Visual Studio .Net 2003, las bibliotecas de Google Test Framework configuran automáticamente la biblioteca en tiempo de ejecución en ' Depuración de un solo subproceso ' para el modo de depuración y ' Un solo subproceso ' para el modo de lanzamiento y como Por lo que he probado, la opción para cambiarlo desde la generación de código no está disponible. Por lo tanto, asegúrese de elegir la opción de subproceso único como su biblioteca de tiempo de ejecución en su proyecto. Aparte de eso, ¡este sencillo y breve tutorial funciona perfectamente!
Neophile
Este es el primero de cinco tutoriales que funcionaron y no promovieron una mala práctica. Me encantaría si esto cubriera el aspecto importante de vincular el proyecto de prueba con el proyecto original ... Más de 30 sitios más tarde, no he encontrado una respuesta que funcione. Pasé 3 días en eso.
persona27
He eliminado el valor en "Propiedades del proyecto> Propiedades de configuración> C / C ++> Biblioteca en tiempo de ejecución", luego funcionó
Manohar Reddy Poreddy
5

Habiendo construido gtest, esto es lo que he hecho:

  1. Agregue \ mypath \ gtest-1.0.1 \ Debug (o Release) a Common Properties-> Linker-> General-> Additional Library Directories
  2. Agregue gtest.lib y gtest_main.lib a Propiedades comunes-> Vinculador-> Entrada-> Dependencias adicionales

Después de eso, simplemente escribo mis pruebas usando TEST o TEST_F según corresponda y las compilo junto con mi función principal:

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
Arlaharen
fuente
5
Recibo muchos errores del vinculador: ya definido en gtest.lib ... por ejemplo: 1> LIBCMT.lib (tidtable.obj): error LNK2005: __encode_pointer ya definido en msvcrt.lib (MSVCR80.dll) Oh, por cierto, yo Estoy intentando escribir pruebas para un código MFC.
knaser
Lo siento. No creo que pueda ayudarte en eso. Por alguna razón, no obtengo esos errores de enlace. ¿Ha intentado crear solo una prueba de hola mundo con gtest?
Arlaharen
gtest_main.libcontiene la mainfunción predeterminada , por lo que probablemente no desee incluirla si escribió la suya mainexplícitamente.
Groo
5

Si no desea escribir su propio main () para las pruebas, puede usar la función main () definida en gtest_main.lib, pero luego obtiene errores del vinculador "El punto de entrada debe definirse" en VS2012. En su proyecto de prueba, configure ProjectProperties-> Linker-> System-> SubSystem en "Console", ya que esto obligará a VS2012 a buscar un punto de entrada llamado "main ()" y lo encontrará en gtest_main.lib (siempre que haya vinculado en correctamente).

philipper
fuente
2

En Microsoft Visual Studio, el tipo de biblioteca de tiempo de ejecución mal configurado provoca errores de enlace.

VS 2005 (y 2008) utiliza DLL multiproceso o DLL de depuración multiproceso de forma predeterminada. Pero la biblioteca de pruebas de Google usa el tiempo de ejecución de depuración Mulithreaded o Mulithreaded de forma predeterminada.

Por lo tanto, elija el tipo de biblioteca de tiempo de ejecución apropiado para la biblioteca de prueba de Google. (en Propiedades de configuración -> Generación de código -> Biblioteca en tiempo de ejecución).

Jinuk Kim
fuente
¿Qué es el tiempo de ejecución apropiado? (MD u otro)
Ramadheer Singh
0

Muchos errores, tomó un tiempo corregirlos.

A continuación se indican unos sencillos pasos:

# Descargue el archivo ZIP de Googletest desde: https://github.com/google/googletest

# Solución de estudio visual de Googletest

Open    C:\googletest\googletest\msvc\2010\gtest.sln
    Change "Solution configuration"
        from "Debug" to "Release"
    Build Solution
        creates gtest.lib

# Tu proyecto:

Project Properties > Configuration Properties > VC++ Directories > Include Directories
    append the following:       ;C:\googletest\googletest\include

Project Properties > Configuration Properties > Linker > General > Additional Library Directories > 
    append the following:           ;C:\googletest\googletest\msvc\2010\gtest\Win32-Release

Project Properties > Configuration Properties > C/C++ > Runtime Library
    Remove the value of the above. (or match it to Googletest project)
Manohar Reddy Poreddy
fuente