Antes vimos cómo compilar Google Test en Linux >>
Ahora se trata de cómo compilar la librería en Windows XP (32bit)

Intentaremos usar CMake para compilarlo.

Es fácil, sólo hay que crear una carpeta, adentro ejecutar

cmake C:\ruta\a\...\gtest

y automágicamente nos genera una solución de Visual Studio 2008 (9)
Creo que ésto porque tengo seteadas las variables de entorno con esta versión de MSVC.

Desde este IDE lo compilamos y nos genera las carpetas Release\ y Debug\ con la librería estática gtest.lib.

En cuanto a los headers, están en la carpeta include\, como era de esperarse.

Eso debiera ser todo…


Pero no.
Al intentar enlazar la librería estática así generada, saltan un montón de errores de símbolos ya definidos en el linker.

Los primeros de éstos dicen relación con un dll del SDK de Windows – MSVCP90, que pertence a las Visual C++ Runtime Library (CRT) –  y son de este tipo (extracto)

msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::~basic_string,class std::allocator >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in gtest.lib(gtest-all.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in gtest.lib(gtest-all.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_stringstream,class std::allocator >::basic_stringstream,class std::allocator >(int)" (??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z) already defined in gtest.lib(gtest-all.obj)

Como bien apunta este QA >>, ésto se resuelve linkeando con las versiones estáticas de las CRT. Ésto se hace en
Propiedades > Propiedades de configuración > C/C++ > Generación de código > Biblioteca en tiempo de ejecución > /MTd (para Debug) o /MT (para Release)

Nótese que esta configuración habrá que hacerla para todas las librerías que incluyamos en el mismo proyecto que Google Test, pues no pueden apuntar a Runtimes diferentes.

De hecho, el README de Google Test recomienda usar los Runtime dinámicos para Visual Studio >= 2005 :

Please note that one must use
the same option to compile both gtest and the test code.  If you use
Visual Studio 2005 or above, we recommend the -md version as /MD is
the default for new projects in these versions of Visual Studio.

Este sitio utiliza cookies.    Leer más