2011-02-02 15 views
6

He codificado una secuencia de comandos que genera un archivo de encabezado con constantes como la versión, la etiqueta svn, el número de compilación. Entonces, tengo una clase que crea una cadena con esta información.Cómo minimizar el tiempo de compilación en C++

Mi problema es el siguiente: Como el archivo se crea en cada compilación, el compilador detecta que el encabezado ha cambiado y obliga a la recompilación de una gran cantidad de archivos. Supongo que el problema está en la situación del archivo de encabezado. Mi proyecto es una biblioteca y el encabezado debe estar en el archivo de encabezado "interfaz con el mundo" (debe ser público).

Necesito algunos consejos para minimizar este tiempo de compilación o para reducir los archivos forzados a recompilar.

+1

Los compiladores generalmente no "detectan" que otros archivos han cambiado y desencadenan la recompilación. Esa es una característica de nivel superior, a menudo implementada por el IDE y/o más explícitamente en el sistema de compilación en sí (por ejemplo, por Make & co). – unwind

+0

@unwind: No eres cierto. Algunos compiladores pueden detectar. –

Respuesta

12

En la cabecera de escribir algo como:

extern const char *VERSION; 
extern const char *TAG; 
extern const char *BUILD_DATE; 

y crear un .c (o.cpp) que contendrá

const char *VERSION = "0.13"; 
const char *TAG = "v_0_13"; 
const char *BUILD_DATE = "2011-02-02 11:19 UTC+0100"; 

Si el script actualiza el archivo .c, solo que el archivo tendrá que volver a compilar, pero los archivos que incluyen el encabezado no lo hará.

+0

Gracias por su solución bien documentada. Fui útil – Killrazor

4

Genera las constantes en el archivo de implementación.

Asegúrate de que tu script no cambie el encabezado.

3

La manera más fácil de resolver esto es no hacer esas constantes en un archivo de encabezado. En su lugar, realice funciones en el archivo de encabezado que obtiene estos valores. A continuación, coloque los valores en un pequeño archivo cpp que implemente esas funciones. (O colóquelos en un encabezado SOLAMENTE incluido en ese archivo cpp). Cuando recompila, solo ese archivo necesitará ser recompilado.

Además, puede buscar en distcc para acelerar la compilación si tiene algunas máquinas de sobra.

1

Si desea mantenerlo como un único encabezado pública, se podría añadir una etapa de pre-construcción que quita el archivo de cabecera pública y

  • filtra los detalles de la versión, o bien retirarlos o sustituirlos con una cadena fija, a una copia temporal del archivo
  • mueve esto a una versión interna de su encabezado solo si ha cambiado, es decir, no copie el archivo (+ actualice la marca de tiempo) a menos que haya cambiado algo que no sea la versión

luego construya su precompi led encabezados desde este archivo de encabezado interno. Aún puede usar el encabezado público con los detalles de la versión de los archivos fuente que necesitan la versión.

Hay una secuencia de comandos cambiada de movimiento en las fuentes de GCC que puede pedir prestada para esto si está en Unix, o puede manipular algo utilizando fc en un archivo por lotes en Windows.

1

Objeto solución orientada:

general, se debe poner esas cnstants menudo renovados a cpp, no h. Ponlos, por ejemplo, en una clase. Si ya tiene una clase que crea una cadena de ellos y la publica por un método, pondría todas esas constantes en la misma cpp y agregaría algunos métodos públicos para acceder a ellos desde otros archivos fuente.

3

Si está utilizando gcc, puede intentar usar ccache. se almacena en caché los archivos basándose en un hash de la salida preprocesado objeto, por lo que no va a volver a compilar a no ser que se produjo un cambio real

2

Otra forma es declarar los valores constantes como en su extern const double PI; un encabezado como "my_constants.h" y añadir un archivo CPP al proyecto con contenidos como:

#include "my_constants.h" 

const double PI = 3.1415926535; 

A continuación, los valores reales sólo habrá compilado una vez, y cambiar un valor solo requiere compilar ese único archivo y vincular el proyecto nuevamente.

Cuestiones relacionadas