2009-08-27 5 views

Respuesta

10

El único beneficio potencial para los encabezados precompilados es que si las compilaciones son demasiado lentas, los encabezados precompilados pueden acelerarlos. Posibles contras:

  • Más dependencias de Makefile para hacer las cosas bien; si están equivocados, construyes lo incorrecto rápido. No está bien.

  • En principio, no todos los encabezados se pueden precompilar. (Piense en poner algunos # define antes de un #include.) Entonces, ¿qué casos realmente acertan los gcc? ¿Cuánto quieres confiar en esta característica de punta sangrienta?

Si su compilaciones son lo suficientemente rápido, no hay ninguna razón para utilizar encabezados precompilados. Si su compilaciones son demasiado lentos, me gustaría considerar

  • La compra de un hardware más rápido, que es barato en comparación con los salarios

  • Utilizando una herramienta como AT & T nmake o como ccache (Dirk está justo en) , ambos utilizan técnicas confiables para evitar recompilaciones.

+3

En realidad, gcc maneja PCH bastante bien. Si existe un #define antes de incluir el pch, simplemente no se usa el pch y se usan los normales. También es posible que desee considerar actualizarse un poco, PCH existe ahora desde hace unos cinco años en gcc y ya no es exactamente sangrado. – hirschhornsalz

+0

Además de ccache, también se puede usar distcc en varias máquinas. –

+0

@drhirsch: Soy un usuario de gcc cauteloso. Cada vez que hay una nueva versión, algo se rompe. Para mí, cinco años todavía está sangrando. –

5

La interfaz de caché ccache para gcc, g ++, gfortran, ... funciona muy bien para mí. Como su sitio web dice

ccache es un caché de compilador. Actúa como un preprocesador de almacenamiento en caché para C/C++ compiladores, utilizando el compilador -E y un hash para detectar cuándo se puede satisfacer una compilación desde caché. Esto a menudo resulta en una aceleración de 5 a 10 veces en compilaciones comunes.

En Debian/Ubuntu, acaba de hacer 'apt-get install ccache' y crear enlaces simbólicos en, por ejemplo, con los nombres /usr/local/bingcc, g++, gfortran, c++, ... que apuntan a /usr/bin/ccache.

[EDITAR ] Para hacer esto más explícito en respuesta a algunos de los primeros comentarios: Esto proporciona esencialmente encabezados precompilados y fuentes de almacenamiento en caché de un trozo más grande del paso de compilación. Por lo tanto, utiliza una idea que es similar a los encabezados precompilados y la lleva más allá. Las aceleraciones pueden ser dramáticas, un factor de 5 a 10, como dice el sitio web.

+6

-1: No estoy seguro de que esto tenga algo que ver con los encabezados precompilados. – quamrana

+6

Esto no tiene nada que ver con los encabezados precompilados. –

+3

@Martin: Simplemente hace que los encabezados precompilados sean inútiles. Acelera la compilación, incluso sin encabezados precompilados. – elcuco

8

No puedo hablar con GNU/gcc/Linux, pero he tratado con encabezados precompilados en VS2005:

Pros:

  • países en tiempo de compilación cuando se tiene grandes cabeceras que muchos de los módulos incluyen.
  • Funciona bien en los encabezados (por ejemplo, de un tercero) que cambian muy poco con poca frecuencia.

Contras:

  • Si los usa para los encabezados que cambian mucho, puede aumentar el tiempo de compilación.
  • Puede ser difícil de configurar y mantener.
  • Existen casos en los que aparentemente los cambios en los encabezados se ignoran si no se fuerza la compilación del encabezado precompilado.
+0

El OP preguntó acerca de GNU/Linux. –

+7

Sin embargo, los pro y los contras también se aplican a gcc. –

4

Para la C simple, evitaría los encabezados precompilados. Como dices, pueden causar problemas y el tiempo de preprocesamiento es muy pequeño en comparación con la compilación normal.

Para C++, los encabezados precompilados pueden ahorrar mucho tiempo, ya que los encabezados de C++ a menudo contienen un código de plantilla grande cuya compilación es costosa. No tengo experiencia práctica con ellos, por lo que le recomiendo que mida la cantidad de ahorros en la compilación que obtiene en su proyecto.Para eso, compile todo el proyecto con encabezados precompilados una vez, luego elimine un solo archivo de objeto y mida cuánto tarda en volver a compilar ese archivo.

0

Estoy usando PCH en un proyecto de Qt, que usa cmake como sistema de compilación, y ahorra mucho tiempo. Cogí algunos scripts de PCM cmake, que necesitaban algunos ajustes, ya que eran bastante antiguos, pero en general era más fácil de configurar de lo que esperaba. Debo agregar que no soy un gran experto en tecnología.

Estoy incluyendo ahora una gran parte de Qt (QtCore, QtGui, QtOpenGL) y algunos encabezados estables a la vez.

Pros:

  • Para las clases de Qt, no se necesitan declaraciones adelantadas, y por supuesto no incluye.
  • Rápido.
  • Fácil de instalar.

Contras:

  • No puede incluir el PCH incluyen en las cabeceras. Esto no es un problema, excepto que use Qt y deje que el sistema de compilación traduzca los archivos moc por separado, que es exactamente mi configuración. En este caso, debe #incluir los encabezados qt en sus encabezados, ya que los mocs se generan a partir de los encabezados. La solución consistía en agregar guardias adicionales alrededor del #include en el encabezado.
+0

De casi todas las personas con las que he hablado, "Fácil de configurar" está tan alejado del consenso como se puede obtener. ¿Puedes elaborar? – Catskul

+0

Lo siento, pero no puedo formatear los comentarios, así que esto viene envuelto. En CMakeLists.txt agregué dos líneas 'include (PCHSupport)' y 'ADD_PRECOMPILED_HEADER (myprojectname $ {CMAKE_SOURCE_DIR} /pch.h)'. En los archivos de implementación del proyecto utilizo un '#include ' al comienzo. Debido a las separaciones de los sistemas de compilación de qt que usan automoc, tengo que incluir pch.h en los encabezados, esto funciona con guardias de inclusión adicionales. Esta última fue en realidad la parte más difícil de descifrar, pero la tuve funcionando en menos de una hora, por lo que considero que es "fácil". – hirschhornsalz

Cuestiones relacionadas