Pregunta Comenzar con PCH en un proyecto de VC ++


Estoy trabajando en un proyecto de VC ++ en VS 2012 que toma alrededor de 8-10 minutos para una compilación completa. Sé que PCH puede acelerar los tiempos de compilación hasta 10 veces. Actualmente he desactivado PCH en mi proyecto y estoy incluyendo archivos de encabezado donde se necesitan. ¿Cómo comienzo con PCH? He buscado guías de "cómo hacerlo" en todas partes, pero lo único que obtuve son los documentos.

Supongo que tendré que:

  1. Configurar mi proyecto para PCH, creando un archivo de encabezado PCH en blanco
  2. Recoge encabezados de cada .cpp archivo y colocarlo en el archivo de encabezado PCH
  3. Modificar cada archivo eliminando todas las importaciones de encabezado
  4. Recompilar y esperar que nada salga mal;)

¿Cómo empiezo con esto (específicamente el # 1)? ¿Ha modificado un proyecto para usar PCH y cuáles son los obstáculos o problemas / problemas comunes en él? ¿Puede PCH causar algún problema o es solo el mismo comportamiento en tiempo de compilación / tiempo de ejecución que el normal? ¿Existe una herramienta para automatizar el proceso o tengo que ir a 500 archivos .cpp a mano y modificarlo para usar PCH?

Y por último, pero no menos importante, ¿cuál es la aceleración del tiempo de compilación que puedo esperar con PCH? ¿Es 2x-10x? ¿O simplemente iría como un 30% más rápido? (lo cual no justifica el tiempo involucrado)


7
2018-05-23 06:30


origen


Respuestas:


Después de configurar mi proyecto para usar PCH, los tiempos de compilación completa se redujeron a la mitad, y las compilaciones incrementales ocurrieron casi al instante. PCH es una forma muy efectiva de acelerar los tiempos de compilación, y lo recomiendo encarecidamente.

Althouh dsharlet menciona muchos puntos importantes, omite algunos pasos cruciales que finalmente tuve que resolver. Así que aquí está la guía completa para configurar su proyecto para usar PCH:

Comenzar con PCH en un proyecto de VC ++

  1. Respalda tu src dir y cualquier otro directorio que contenga código fuente ... (lo necesitarás en caso de que algo salga mal)

  2. Crea 2 archivos en tu proyecto, Globals.cpp y Globals.h .. (elija cualquier nombre, pero manténgalo)

  3. Botón derecho del ratón Globals.cpp y abierto Propiedades, elija Configuración> Todas las configuraciones

  4. Ir a C / C ++ | Encabezado precompilado, y rellene estos en:

    • Encabezado precompilado : Crear (/ Yc)
    • Archivo de encabezado precompilado : Globals.h
  5. Abierto Globals.cpp y agregue esta línea en, y nada mas: #include "Globals.h"

  6. Haga clic derecho en su proyecto de VC ++ y ábralo Propiedades, elija Configuración> Todas las configuraciones

  7. Ir a C / C ++ | Encabezado precompilado, y rellene estos en:

    • Encabezado precompilado : Usar (/ Yu)
    • Archivo de encabezado precompilado : Globals.h
  8. Abre todo .h y .cpp archivos en su proyecto, y agregue esto en la parte superior: #include "Globals.h"

  9. Abierto Globals.h y agregue lo siguiente en: (es muy importante que tenga #pragma once en la cima)

     #pragma once
    
     #include <stdio.h>
     #include <stdlib.h>
     #include <stdarg.h>
     #include <stddef.h>
     #include <memory>
     #include <string.h>
     #include <limits.h>
     #include <float.h>
     #include <time.h>
     #include <ctype.h>
     #include <wchar.h>
     #include <wctype.h>
     #include <malloc.h>
     #include <locale.h>
     #include <math.h>
    
     // Windows SDK
     #define _WIN32_WINNT 0x0501     // _WIN32_WINNT_WINXP
     #include <SDKDDKVer.h>
    
     // Windows API
     #define WIN32_LEAN_AND_MEAN
     #include <windows.h>
    
    • Estos incluyen son candidatos típicos para su archivo PCH
    • Elimina los que no estás usando
    • Repase su proyecto y recopile más archivos de encabezado que no cambies a menudo
  10. Usando buscar y reemplazar, busca cada uno de los #includeestá en su archivo PCH, y eliminarlos de todos .h y .cpp archivos en tu proyecto.

  11. Haga una compilación completa y asegúrese de que todo esté funcionando bien. Aquí hay algunas soluciones para problemas comunes que encontrará:


El archivo PCH se incluye a sí mismo:

Su archivo PCH incluye un encabezado que incluye el archivo de encabezado PCH nuevamente, creando un tipo de dependencia circular. Haga doble clic en el error para llevarlo al archivo ofensivo, y simplemente elimine la línea que dice #include "Globals.h"


Símbolo no definido X

Aunque todos sus archivos de proyecto pueden incluir el encabezado PCH, los archivos incluidos dentro ¡el encabezado PCH no puede incluir el encabezado PCH! (como se indicó anteriormente), por lo que deberá volver a agregar las importaciones que estaban previamente en el archivo. (diff el archivo con la versión de copia de seguridad)


No se puede encontrar el símbolo logf

A veces, el archivo PCH global no se comporta como se esperaba y se rompe la compilación con errores locos que son imposibles de resolver. A continuación, puede desactivar PCH para archivos de código fuente individuales.

  1. Haga clic derecho en su .cpp archivo y abierto Propiedades, elija Configuración> Todas las configuraciones

  2. Ir a C / C ++ | Encabezado precompilado, y rellene estos en:

    • Encabezado precompilado : No utiliza encabezados precompilados
  3. Eliminar la linea #include "Globals.h" en tus .cpp archivo

  4. Agregue lo que importó originalmente el archivo. (diff el archivo con la versión de copia de seguridad)


7
2018-05-25 06:07



Así es como uso PCH con resultados decentes:

  1. Ve a la proyecto propiedades, C / C ++ | PCH establece la opción de encabezado precompilado en 'Usar'. Establezca el archivo de encabezado precompilado en algo que desee.
  2. Vaya a las propiedades de un archivo cpp que quiera que sea el PCH, y establezca la opción de encabezado precompilado en 'Crear' (de manera predeterminada habrá 'Usar' desde la configuración de la propiedad del proyecto).
  3. Incluya el encabezado pch en todos sus archivos cpp en el proyecto (básicamente, los que tienen el 'Uso' configurado para la opción de encabezado precompilado). Supongo que podría desactivar 'Usar' para algunos archivos cpp en el proyecto en lugar de agregar el incluir para PCH, pero nunca lo intenté ...

En este punto, el proyecto aún debe construir y comportarse exactamente como solía hacerlo, pero puede que no haya una mejora real en el tiempo de compilación. Ahora, necesitarás moverte algunos de su #include "... h" al archivo de encabezado PCH (y elimine los archivos incluidos de otros lugares del proyecto). El incluye que debe mover al encabezado PCH deben ser encabezados que son incluido en muchos archivos, pero cambiar con poca frecuencia. Ejemplos: encabezados STL, windows.h, encabezados de funcionalidad central de su proyecto, etc.

Una vez que PCH está configurado, debe ser transparente. Básicamente, solo ayuda al compilador a guardar en caché algunos datos de compilación intermedios. En otras palabras, si desactivaste PCH en tu proyecto, todo debería seguir compilando exactamente como lo habría hecho con PCH encendido (¡excepto más lento!)

La aceleración depende completamente de la cantidad de código que se mueva al PCH (cuánto código incluido de los encabezados se mueve de los archivos cpp arbitrarios al encabezado PCH). He visto mejoras múltiples veces, pero no lo he comparado con precisión. Definitivamente sentí que valía la pena hacerlo cuando me tomé el trabajo de usar PCH en un gran proyecto.


1
2018-05-23 07:11