2012-10-12 75 views
8

Utilizo GoogleTest para probar mis proyectos C++, y después de encontrar que las bibliotecas precompiladas ya no se distribuían en el paquete Ubuntu, encontré lo siguiente en el sitio web del proyecto:Es seguro vincular a una biblioteca estática construida con diferentes indicadores de compilación

Si compila prueba Google y su código de prueba usando diferentes compilador banderas, pueden ver diferentes definiciones de la misma clase /función/variable (por ejemplo, debido a la utilización de #if en Google Test). Por lo tanto, para su cordura, recomendamos evitar la instalación de las bibliotecas de Google Test compiladas . En su lugar, cada proyecto debe compilar Google Test de manera que pueda estar seguro de que se usan los mismos distintivos tanto para Google Test como para las pruebas.

Lo que quiero sacar de esto es que es una mala idea compilar GoogleTest por separado del proyecto que se está probando. Lo que no entiendo es si esto es solo una cuestión de GoogleTest, o si esto es algo general para vincular bibliotecas.

Pregunta

¿Hay alguna situación en la que no es seguro para vincular a precompilado bibliotecas de terceros, opciones del compilador o de otra manera, y si no, ¿qué tiene de especial GoogleTest?

+0

Su cita parece carecer de la parte importante: 'Si compila Google Test y su código de prueba utilizando diferentes indicadores de compilación, pueden ver diferentes definiciones de la misma clase/función/variable (por ejemplo, debido al uso de #if en Google Test).' –

+0

He actualizado la cita con el bit que señalas. –

Respuesta

6

Hay algunos indicadores de compilación, especialmente aquellos que funcionan con alineación, que podrían causar un problema.

De GCC i386 and x86-64 flags

-malign doble
-mno-align doble

de control si GCC alinea las variables dobles, largos doble, y largos largos en un límite de dos palabras o un límite de una palabra. Alinear variables dobles en un límite de dos palabras produce un código que se ejecuta de forma más rápida en un Pentium a expensas de más memoria.

En x86-64, -malign-double está habilitado de manera predeterminada.

Advertencia: si utiliza el modificador -malign-double, las estructuras que contienen los tipos anteriores están alineadas de forma diferente que las especificaciones de interfaz binaria de la aplicación publicada para el 386 y no son compatibles con estructuras en código compilado sin ese interruptor.

Por ejemplo, usar esa bandera en un sistema de 32 bits para dobles y largos estará alineada con 64 bits. Si compila una biblioteca sin el distintivo y luego intenta usar la biblioteca mientras usa el marcador, las estructuras que contienen los tipos anteriores pueden tener diferentes alineamientos y no pueden interoperar.

Otros casos (mucho más simples) también pueden garantizar el mismo conjunto de #defines para garantizar que se usen las mismas definiciones de función/estructura/clase (y otras violaciones de ODR). Por ejemplo, el uso de '--std = C++ 11' en gcc, que habilita las versiones de C++ 11 de las clases de la Biblioteca estándar, que en algunos casos son diferentes a las versiones anteriores.

+1

's/will/may/g' - dependiendo de la suerte, la biblioteca puede funcionar muy bien. –

Cuestiones relacionadas