c++ linux gcc precompiled-headers

c++ - ¿Cuáles son las ventajas y desventajas de los encabezados precompilados específicamente en un entorno/cadena de herramientas GNU/Linux?



gcc precompiled-headers (6)

El único beneficio potencial de los encabezados precompilados es que si las compilaciones son demasiado lentas, los encabezados precompilados podrían acelerarlos. Contras potenciales:

  • Más dependencias de Makefile para salir bien; Si están equivocados, construyes rápido lo incorrecto. No está bien.

  • En principio, no todos los encabezados pueden ser precompilados. (Piense en poner algunos # define antes de un #include.) Entonces, ¿en qué casos realmente funciona el gcc? ¿Cuánto quieres confiar en esta característica de vanguardia?

Si sus compilaciones son lo suficientemente rápidas, no hay razón para usar encabezados precompilados . Si tus compilaciones son demasiado lentas, consideraría

  • Comprar hardware más rápido, que es barato en comparación con los salarios

  • Usando una herramienta como AT&T nmake o like ccache (Dirk tiene razón), ambos usan técnicas confiables para evitar las recompilaciones.

Los encabezados precompilados parecen que pueden ahorrar mucho tiempo en proyectos grandes, pero también parecen ser una molestia que tiene algunos errores.

¿Cuáles son los pros y los contras de usar encabezados precompilados, y específicamente en relación con su uso en un entorno Gnu / gcc / Linux?


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

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

En Debian / Ubuntu, simplemente haga '' apt-get install ccache '' y cree soft-links en, digamos, /usr/local/bin con los nombres gcc , g++ , gfortran , c++ , ... que apuntan a /usr/bin/ccache

[ EDITAR ] Para hacer esto más explícito en respuesta a algunos comentarios iniciales: Esto proporciona esencialmente encabezados y fuentes precompilados al almacenar en caché una parte 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 lejos. Las aceleraciones pueden ser dramáticas, un factor de 5 a 10 como dice el sitio web.


Estoy utilizando PCH en un proyecto de Qt, que usa cmake como sistema de compilación y ahorra mucho tiempo. Tomé algunos scripts de PCH cmake, que necesitaban algunos ajustes, ya que eran bastante antiguos, pero en general era más fácil de configurar de lo que esperaba. Tengo que añadir que no soy muy experto en hacer cosas.

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

Pros:

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

Contras:

  • No puede incluir la inclusión de PCH en los encabezados. Esto no es un gran problema, excepto que use Qt y deje que el sistema de compilación traduzca los archivos moc por separado, lo que resulta ser exactamente mi configuración. En este caso, debe #incluir los encabezados qt en sus encabezados, porque los mocs están geneteados desde los encabezados. La solución fue colocar guardias de inclusión adicionales alrededor del #include en el encabezado.

No puedo hablar con GNU / gcc / linux, pero he tratado con encabezados precompilados en vs2005:

Pros:

  • Ahorra tiempo de compilación cuando tienes encabezados grandes que incluyen muchos módulos.
  • Funciona bien en encabezados (por ejemplo, de un tercero) que cambian con muy poca frecuencia.

Contras:

  • Si los usa para encabezados que cambian mucho, puede aumentar el tiempo de compilación.
  • Puede ser fácil de configurar y mantener.
  • Hay casos en que los cambios en los encabezados se ignoran aparentemente si no obliga a compilar el encabezado precompilado.

Para el plano C, evitaría encabezados precompilados. Como usted dice, pueden causar problemas, y el tiempo de preprocesamiento es realmente pequeño en comparación con la compilación regular.

Para C ++, los encabezados precompilados potencialmente 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 te recomiendo medir cuánto ahorro en compilación obtienes en tu proyecto. Para eso, compile todo el proyecto con encabezados precompilados una vez, luego elimine un solo archivo de objeto y mida cuánto tiempo se tarda en volver a compilar ese archivo.