visual usuario studio requiere proyecto generar exportar datos compiler compilar como abrir c++ visual-c++ precompiled-headers pch

c++ - usuario - Compartir encabezados precompilados entre proyectos en Visual Studio



visual studio compiler (5)

Esto suena como un caso de "rendimientos decrecientes" para mí. 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 su proyecto completo 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 difícil de configurar, ya que es una configuración no estándar no compatible con los asistentes VS) produce solo una décima parte del ahorro.

Tengo una solución con muchos proyectos de Visual C ++, todos usan PCH, pero algunos tienen conmutadores de compilación específicos activados para necesidades específicas del proyecto.

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 proyectos, de modo que en lugar de compilar cada PCH por proyecto, podría tener una PCH común que la mayoría de los proyectos en la solución podrían usar.

Parece posible especificar la ubicación de PCH como una ubicación compartida en la configuración del proyecto, por lo que tengo la corazonada de que esto podría funcionar. También supongo que todos los archivos fuente en todos los proyectos que usan una PCH compartida deberían tener la misma configuración de compilación, o de lo contrario el compilador se quejaría de las incoherencias entre la PCH y el archivo fuente que se está compilando.

¿Alguien ha probado esto? ¿Funciona?

Una pregunta relacionada: ¿debería ser demasiado inclusivo un PCH de este tipo, o eso dañaría el tiempo total de construcción? Por ejemplo, una PCH compartida podría incluir muchos encabezados STL que son ampliamente utilizados, pero algunos proyectos pueden necesitar <string> y <vector> . ¿El tiempo ahorrado mediante el uso de una PCH compartida debe devolverse en un punto posterior del proceso de compilación cuando el optimizador tendría que descartar todas las cosas no utilizadas arrastradas al proyecto por PCH?


La respuesta de Samaursa funcionó para mí.

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

Este usa copy mientras que Reginald usa xcopy (prefiero xcopy ). De cualquier manera, gracias - esto aceleró mis construcciones considerablemente.


Parece que no es posible porque cada archivo fuente debe compilarse contra el mismo PDB contra el que se compiló el PCH. Maldita sea.


Sí, es posible y puedo asegurarle que el ahorro de tiempo es significativo. Cuando compila su PCH, debe copiar los archivos .pdb y .idb del proyecto que está creando el archivo PCH. En mi caso, tengo un proyecto simple de dos archivos que está creando un archivo PCH. El encabezado será su encabezado PCH y se le indicará a la fuente que cree el PCH en la configuración del proyecto; esto es similar a lo que haría normalmente en cualquier proyecto. Como mencionó, debe tener la misma configuración de compilación para cada configuración, de lo contrario surgirá una discrepancia y el compilador se quejará.

Copiar los archivos mencionados anteriormente cada vez que hay una reconstrucción o cada vez que se recompila PCH va a ser un problema, por lo que lo automatizaremos. Para automatizar la copia, realice un evento de preconstrucción en el que los archivos mencionados anteriormente se copien en el directorio apropiado. Por ejemplo, si está compilando compilaciones de Debug y Release de su PCH, copie los archivos de Debug de su proyecto PCH en la Debug de su proyecto dependiente. Entonces, un comando de copia se vería así

copia PchPath / Debug * .pdb Debug / / -Y

Tenga en cuenta el /-Y al final. Después de la primera compilación, cada compilación subsiguiente se compila de forma incremental, por lo tanto, si reemplaza los archivos nuevamente, Visual Studio se quejará de los símbolos dañados. Si se corrompen, siempre puede realizar una reconstrucción, que copiará los archivos nuevamente (esta vez no se saltará porque ya no existen, la limpieza borrará los archivos).

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

EDITAR: junto con varias otras personas, he probado esto en VS2010 y VS2012 y parece que funciona correctamente.


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

Básicamente, debe crear un nuevo proyecto para el encabezado precompilado y que el resto del proyecto dependa de él. Aquí esta lo que hice:

Paso a paso:

  1. Cree un proyecto nuevo 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 incluya pch.h. El proyecto debería crear una lib 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 relativo a IntDir, pero para las configuraciones predeterminadas podría ser relativo a $ (SolutionDir). El proyecto de pch solo debe tener definido todos los demás proyectos también tienen.

  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.

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

    1. Configure todos los proyectos (incluido el proyecto pch) para usar el mismo archivo de símbolos del compilador (el archivo de símbolos del enlazador no se ve afectado). De nuevo, en mi ejemplo, este 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 (ver la captura de pantalla anterior), de lo contrario, Visual Studio no podrá compilar proyectos en paralelo.

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