Pregunta

Yo tengo una solución con muchos proyectos de Visual C++, utilizando en todos PCH, pero algunos han compilador interruptores de encendido para el proyecto a las necesidades específicas.

La mayoría de estos proyectos comparten el mismo conjunto de encabezados en sus respectivos stdafx.h (STL, boost, etc).Me pregunto si es posible compartir PCH entre los proyectos, de modo que en lugar de compilar cada PCH por proyecto podría tal vez tienen una forma común de PCH que la mayoría de los proyectos en la solución sólo podría utilizar.

Parece posible especificar la ubicación de la PCH como una ubicación compartida en la configuración del proyecto, así que tengo un presentimiento de que esto podría funcionar.También estoy suponiendo que todos los archivos de origen en todos los proyectos que comparten una PCH tendría que tener la misma configuración de compilador, o de lo contrario el compilador se queja acerca de las inconsistencias entre el PCH y el archivo de código fuente se compila.

Alguien ha probado esto?Funciona?

Una pregunta relacionada:si un fragmento de PCH ser excesivamente amplia, o que lastiman el tiempo de construcción en general?Por ejemplo, una PCH podrían incluir muchas cabeceras de STL que son ampliamente utilizados, pero algunos projecst posible que sólo necesite <string> y <vector>.Sería el ahorro de tiempo mediante el uso compartido de la PCH tiene que ser pagado de nuevo en un momento posterior en el proceso de construcción cuando el optimizador habría que descartar todas las cosas sin usar arrastrado en el proyecto por parte de la PCH?

¿Fue útil?

Solución

Sí es posible y puedo asegurar a usted, el ahorro de tiempo es importante.Cuando se compila el PCH, tienes que copiar el .pdb y .idb archivos del proyecto que está creando el archivo PCH.En mi caso, tengo dos simples archivo de proyecto que es la creación de un archivo PCH.El encabezado será su PCH y el encabezado de la fuente le dijo a crear el PCH en configuración del proyecto - esto es similar a lo que haces normalmente en cualquier proyecto.Como usted ha mencionado, tienen que tener el mismo compilar la configuración para cada configuración de lo contrario, una discrepancia surgir y el compilador se quejará.

Copia de los mencionados archivos cada vez que hay una reconstrucción o cada vez que el PCH se vuelve a compilar va a ser un dolor, así que vamos a automatizar.Para automatizar la copia, realizar un pre-evento de generación en donde los mencionados archivos se copian en el directorio apropiado.Por ejemplo, si está compilando Debug y Release se construye de la PCH, copie los archivos de Debug de su PCH proyecto a través de su dependiente del proyecto Debug.Así que un comando de copia tendría este aspecto

copia PchPath\Debug*.ap Debug\ /-Y

Nota la /-Y en la final.Después de la primera generación, cada generación posterior es incrementalmente compilado, por lo tanto, si reemplazar los archivos de nuevo, Visual Studio se quejan dañado símbolos.Si se llega dañado, siempre se puede realizar una reconstrucción, la cual copia los archivos de nuevo (esta vez no les pase como que ya no existe - la limpieza elimina los archivos).

Espero que esto ayude.Me tomó bastante tiempo para ser capaz de hacer esto, pero valió la pena.Tengo varios proyectos que dependen de un gran marco, y el PCH necesita ser compilado sólo una vez.Todos los proyectos dependientes compilar muy rápidamente.

EDITAR:Junto con varias otras personas, he probado esto en virtud de VS2010 y VS2012 y parece funcionar correctamente.

Otros consejos

Si bien esta es una pregunta anterior, quiero dar una nueva respuesta que funcione en Visual Studio 2017 y no implique ninguna copia. Única desventaja: editar y continuar ya no funciona.

Básicamente, debe crear un nuevo proyecto para el encabezado precompilado y hacer que todos los demás proyectos dependan de él. Esto es lo que hice:

Paso a paso:

  1. Cree un nuevo proyecto dentro de su solución que incluya el encabezado (llamado pch.h de aquí en adelante) y un archivo cpp de una línea que incluye pch.h. El proyecto debe crear una biblioteca estática. Configure el nuevo proyecto para crear un encabezado precompilado. El archivo de salida debe ser accesible para todos los proyectos. para mí esto es relativo a IntDir, pero para la configuración predeterminada podría ser relativo a $ (SolutionDir). El proyecto pch solo debe tener define todos los demás proyectos tienen también.

     configuración del proyecto pch

  2. Haga que todos los demás proyectos dependan de este nuevo proyecto. De lo contrario, el orden de compilación podría ser incorrecto.

     referencias de proyecto

  3. Configura todos los demás proyectos para usar pch.h. Vea cómo los parámetros del archivo de salida son los mismos que en el proyecto pch. Los directorios de inclusión adicionales también deben apuntar al directorio pch.h. Opcionalmente, puede forzar la inclusión del archivo pch en cada cpp (o puede incluirlo manualmente en la primera línea de cada archivo cpp).

     pch incluir incluir

    1. Configure todos los proyectos (incluido el proyecto pch) para usar el mismo archivo de símbolo del compilador (el archivo de símbolo del vinculador no se ve afectado). Nuevamente, en mi ejemplo, esto es OutDir, pero en su solución esto puede variar. Tiene que apuntar al mismo archivo en el disco. El formato de información de depuración debe establecerse en C7 (vea la captura de pantalla anterior), de lo contrario, Visual Studio no podrá compilar proyectos en paralelo. pdb

Espero no haber olvidado nada. Para mi solución (130k loc, 160 proyectos) esto condujo a un tiempo de compilación de ~ 2: 30mins en lugar de ~ 3: 30mins.

Parece que no es posible porque cada archivo fuente tiene que ser compilado contra el mismo PDB contra el cual se compiló la PCH. maldita sea.

La respuesta de Samaursa funcionó para mí.

También vi esto enlace que funciona (busque la respuesta de Reginald cerca de la parte inferior).

Este usa copy mientras que Reginald's usa xcopy (prefiero <=>). De cualquier manera, gracias, esto aceleró considerablemente mis construcciones.

Esto suena como un caso de " rendimientos decrecientes " a mi. Supongamos que incluir los encabezados comunes desperdicia directamente 1 segundo por archivo .cpp, y cada destino (DLL / EXE) tiene 10 archivos .cpp. Al usar un .pch por objetivo, ahorras 10 segundos por objetivo. Si todo su proyecto tiene 10 objetivos, ahorrará 1.5 minutos en toda la compilación, lo cual es bueno.

Pero al reducirlo a un .pch para todo el proyecto, solo ahorraría otros 9 segundos. ¿Vale la pena? El esfuerzo adicional (que puede ser mucho más complicado de configurar, ya que es una configuración no estándar no compatible con los asistentes de VS) produce solo una décima parte del ahorro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top