2011-05-04 15 views
5

Estoy compilando una biblioteca estática que contiene principalmente clases con plantillas. Cuando se compila con gcc, el archivo .a resultante tiene alrededor de la marca de 40Mb. Esto es bastante grande, pero no del todo inesperado debido a la cantidad de plantillas que están sucediendo. Sin embargo, cuando compilo el mismo código usando VS2005, el archivo .lib resultante está llegando al (esperar a que!) 575Mb ..Enorme archivo de biblioteca estática cuando se compila con VS2005, tamaño normal cuando se compila con gcc

Ahora, antes de que me quemo, he visto: How can I get my very large program to link? y esto es útil para Entender que las plantillas pueden hacer que las librerías sean grandes, pero me cuesta entender por qué las salidas de los dos compiladores son de un tamaño tan diferente.

opciones

VS son: (depuración)

/Od /D "WIN32" /D "_DEBUG" /D "_LIB" /D "_WIN32_WINNT=0x0500" /D "_MBCS" /Gm /EHsc /RTC1 /MDd /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt 

(Release)

/O2 /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WIN32_WINNT=0x0500" /D "_MBCS" /FD /EHsc /MD /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt 

Cualquier comentario o sugerencias son muy apreciadas ..

+0

Está construyendo una compilación Debug en VS2005 ('/ D" _DEBUG "') - ¿Es esto lo mismo que GCC? Esto puede hacer una gran diferencia. –

+0

Tienes razón, lo hace ... La versión de compilación de lanzamiento en VS2005 es * solo * 350Mb .. ¡Sin embargo, no es ni mucho menos lo suficientemente pequeña! – StevieG

+0

¿Está utilizando generación de código Linktime (LTCG)? Esto hace que las bibliotecas estáticas sean muy grandes y luego el optimizador reduce el código final al momento del enlace. –

Respuesta

3

una versión de depuración desactiva procesos en línea y también el Opciones de vinculador que descartan el código duplicado, por lo que obtiene muchas copias de cada plantilla y función en línea.

Puede activarlo con /OPT:REF /OPT:ICF en sus opciones de enlazador. Pero debería estar allí por defecto en una compilación de lanzamiento.

Desafortunadamente, creo que solo ayuda con su ejecutable final, no con la biblioteca intermedia.

Puede ahorrar espacio creando instancias explícitas de las instancias de plantilla que necesita en un archivo .cpp y utilizando extern template para evitar la creación de instancias automática al compilar otros archivos de origen.

+0

Sí, definitivamente soy pensando en estas líneas para reducir los tamaños en general ... pero todavía no puedo entender por qué es mucho mejor en gcc, sin ninguna instanciación explícita u otras optimizaciones de codificación ... – StevieG

+0

Yo también. Me pregunto si se relaciona con la vinculación a nivel funcional (/ Gy, implícito en/O2). Es una buena optimización, pero debe aumentar la sobrecarga en los archivos de objeto, especialmente si tiene muchas pequeñas funciones en línea generadas repetidamente. Podría intentar especificar/Gy-in modo de liberación para ver si hace alguna diferencia. –

+0

Aceptar esta respuesta es la más útil, aunque el problema persiste. – StevieG

Cuestiones relacionadas