2012-06-09 23 views
6

de reproducción: gcc versión 4.2.1 (Apple Inc. construir 5664)lento tiempo de compilación con GCC Boost + + encabezado precompilado

creé un proyecto XCode manzana con un encabezado precompilado por defecto. Parece ser muy lento, y un archivo principal trivial con una función principal no incluye ningún código tarda 6 segundos para compilar, que es después de que actualicé a una nueva unidad SSD. Estoy en una computadora portátil, pero tengo reservas de que la actualización a una estación de trabajo aliviaría mi problema. Si apago el encabezado precompilado, el archivo principal se compila en menos de un segundo. Parece que usar un encabezado precompilado pone una penalización en todos los archivos. Esta demora me hace querer evitar compilar y experimentar con código que no es bueno. Esto es lo que estoy incluyendo en mi encabezado precompilado:

#pragma once 

#include <algorithm> 
#include <bitset> 
#include <complex> 
#include <deque> 
#include <fstream> 
#include <functional> 
#include <iostream> 
#include <istream> 
#include <iterator> 
#include <limits> 
#include <list> 
#include <locale> 
#include <map> 
#include <numeric> 
#include <ostream> 
#include <queue> 
#include <set> 
#include <sstream> 
#include <stack> 
#include <stdexcept> 
#include <streambuf> 
#include <string> 
#include <valarray> 
#include <vector> 

#include <boost/smart_ptr/scoped_ptr.hpp> 
#include <boost/smart_ptr/scoped_array.hpp> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/smart_ptr/shared_array.hpp> 
#include <boost/smart_ptr/make_shared.hpp> 
#include <boost/smart_ptr/weak_ptr.hpp> 
#include <boost/smart_ptr/intrusive_ptr.hpp> 

#include <boost/regex.hpp> 
#include <boost/thread.hpp> 
#include <boost/bind/bind.hpp> 
#include <boost/bind/apply.hpp> 
#include <boost/bind/protect.hpp> 
#include <boost/bind/make_adaptable.hpp> 

#include <boost/asio.hpp> 
//#include <boost/asio/ssl.hpp> 


#include <boost/property_tree/ptree.hpp> 
#include <boost/random.hpp> 
#include <boost/lexical_cast.hpp> 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/local_time/local_time.hpp> 
#include <boost/date_time/time_zone_base.hpp> 
#include <boost/circular_buffer.hpp> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics.hpp> 

No he incluido espíritu, lo que realmente hace que el tiempo de compilación subir.

+0

Entonces, ¿un "archivo principal trivial con una función principal sin incluir ningún código" toma mucho menos tiempo en compilarse que un proyecto con todas las opciones enumeradas anteriormente? ¿No debería ser eso esperado? – jedwards

+0

Además, mi comprensión de los encabezados precompilados es que solo tienden a ahorrar tiempo de compilación cuando de lo contrario se compilarían repetidamente, a través de 'include's de múltiples fuentes. Este no es el caso para usted, así que me imagino que su tiempo de compilación con el uso de encabezados precompilados sería similar a sin. Es decir, no obtendrías mucho de una ganancia al usar encabezados precompilados. Realmente debería limitar sus inclusiones a lo que necesita en base a un archivo fuente específico. – jedwards

+0

¿Y qué significa esto: "Esta demora me hace querer evitar compilar y experimentar con código que no es bueno"? – jedwards

Respuesta

7

Los encabezados precompilados de GCC funcionan de una manera muy particular. Solo un archivo de encabezado precompilado se puede usar en cualquier archivo fuente dado. Use -H para mostrar si un archivo de encabezado dado usa una versión precompilada o no.

Además, debe compilar el archivo de encabezado con los mismos indicadores de compilación exactos que el archivo de origen que lo utiliza.

La forma típica de configurar un entorno de PCH es la siguiente:

main.cpp:

#include "allheaders.hpp" 

int main() { /* ... */ } 

allheaders.hpp:

#include <algorithm> 
// ... everything you need 

Compilación:

g++ $CXXFLAGS allheaders.hpp     # 1 
g++ $CXXFLAGS -H -c -o main.o main.cpp  # 2 
g++ $LDFLAGS -o myprogram main.o    # 3 

Después del paso n. ° 1 debe terminar con un archivo allheaders.hpp.gch, que debería ser bastante grande. En el paso n. ° 2, el indicador -H debe producir un resultado adicional que indique que se está utilizando el archivo de encabezado precompilado. El paso # 3 vincula el ejecutable.

La idea es que el paso n. ° 1 puede tomar mucho tiempo, pero el paso n. ° 2 debería ser mucho más rápido.

+1

He analizado el comando GCC y hace referencia a un archivo de pseudo-texto de 308 MB que parece ser un encabezado precompilado procesado. El encabezado precompilado se incluye automáticamente para cada archivo fuente, lo que algunas personas parecen no obtener, e introduce una latencia de aproximadamente 6 segundos. No recuerdo haber tenido este problema con Visual Studio, aunque con VS siempre lo ejecuto en una estación de trabajo más robusta.Un tiempo de demora de 6 segundos cuando cambio una letra en un archivo es inaceptable y se suma a minutos/horas/días de tiempo desperdiciado durante el ciclo de desarrollo. – user805547

+0

Bueno, deberías ser inteligente acerca de qué encabezados precompilar. Por supuesto, no debería tener una PCH única para todos. Lo ideal sería crear un encabezado "todos los encabezados" por separado para * cada * archivo fuente individualmente. Prácticamente, reservaría ese tratamiento para esos archivos que realmente implementan todas las cosas pesadas de Boost. –

+0

Utilizo boost prácticamente en todas partes, por lo tanto, no ponerlos en el PCH hará que los archivos individuales se compilen lentamente. Estoy empezando a pensar que esta computadora portátil y el software son demasiado lentos para el desarrollo serio de C++. Está bien para Cocoa, pero Boost y su uso intensivo de plantillas y metaprogramación es un asesino. – user805547

Cuestiones relacionadas