2012-09-23 12 views
5

Estoy trabajando en un proyecto grande que debe compilarse en múltiples entornos, principalmente linux/gcc y windows/msvc. Para acelerar la construcción, usamos encabezados precompilados.Sin aceleración con encabezados precompilados en gcc (pero gran aceleración con Visual Studio)

La implementación de Windows es muy eficiente: en mi quad-core hyperthreaded i7, el tiempo de construcción disminuye de 9 minutos a 1.5 minutos. Sin embargo, el uso de encabezados precompilados no parece mejorar el rendimiento: en ambos casos se genera en 22 minutos debajo de una caja virtual en la misma computadora, o alrededor de 40 minutos en un servidor real.

Así que estoy pensando lo obvio, que de alguna manera tengo algo mal y que el encabezado precompilado no está funcionando. No obstante, no puedo encontrar qué.

Nuestros Makefiles son generados por CMake, por lo que puedo copiar y pegar el código utilizado para compilar el encabezado y los archivos de objetos que los utilizan.

Creación de la cabecera:

/usr/bin/c++ -O3 -DNDEBUG --no-warnings "-I/mnt/code/server a/src/game" 
"-I/mnt/code/server a/src/game/vmap" "-I/mnt/code/server a/dep/include/g3dlite" 
"-I/mnt/code/server a/dep/include" "-I/mnt/code/server a/src/shared" 
"-I/mnt/code/server a/src/framework" "-I/mnt/code/server a/buildlinux" 
"-I/mnt/code/server a/buildlinux/src/shared" -I/usr/include/mysql 
"-I/mnt/code/server a/dep/acelite" -DDO_MYSQL -DHAVE_CONFIG_H 
-DVERSION=\"0.6.1\" -DSYSCONFDIR=\"../etc/\" -D_RELEASE -D_NDEBUG -x c++-header 
-o "/mnt/code/server a/buildlinux/src/game/pchdef.h.gch" "/mnt/code/server 
a/src/game/pchdef.h" 

Compilar un archivo de objeto:

/usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) "-I/mnt/code/server 
a/buildlinux/src/game" -include pchdef.h -Winvalid-pch -o 
CMakeFiles/game.dir/AccountMgr.cpp.o -c "/mnt/code/server 
a/src/game/AccountMgr.cpp" 

Insights son apreciados, incluso si no lo hacen directamente se derivan de los fragmentos anteriores.

+1

Tienes suerte, he encontrado que el uso de encabezados precompilados con GCC incluso ralentiza la compilación. CLANG fue mejor hace algún tiempo, pero ahora parece que no vale la pena usar encabezados precompilados, dejando a MSVC como el único compilador que se beneficia de él. – Lothar

Respuesta

1

Hay un par de cosas que debe prestar atención al usar encabezados precompilados en GCC. En primer lugar, el encabezado precompilado se debe crear con los mismos argumentos que los archivos cpp se están compilando. También supongo que realmente ha incluido el encabezado precompilado en AccountMgr.cpp?

Intente compilar con el indicador -H, esto arrojará los archivos incluidos que se están considerando. Compruebe que se menciona el archivo pchdef y vea qué otros archivos de inclusión se están analizando. Para que gcc se queje de archivos PCH no válidos, considere usar -Winvalid-pch.

+0

Si miras los comandos, verás que ya estoy usando '-Winvalid-pch'. Además, no incluyo el archivo de encabezado en 'AccountMgr.cpp', pero el encabezado se incluye con la opción' -include'. Trataré de usar el indicador '-H' e informaré. – Norswap

+0

Lo ejecuté con la bandera "-H", definitivamente ve y usa el encabezado precompilado. El misterio se espesa. – Norswap

+0

Por "usos", ¿quiere decir que la lista de archivos incluidos muestra que los archivos incluidos precompilados no se incluyen nuevamente? Es decir. intente ejecutar -H, una vez con -include y una vez sin. Si el resultado es el mismo, entonces su PCH no incluye nada relevante (o AccountMgr.cpp no ​​usa muchos) y solo pierde el tiempo usando PCH, o es una nueva pista. – dseifert

Cuestiones relacionadas