2008-09-12 7 views
85

alguien tenía ningún éxito conseguir encabezados precompilados que trabajan con GCC? No he tenido suerte en mis intentos y no he visto muchos buenos ejemplos de cómo configurarlo. He probado cygwin gcc 3.4.4 y estoy usando 4.0 en Ubuntu.encabezados precompilados con GCC

+0

Lo probé y tuve el caso de uso óptimo para los encabezados precompilados porque mi fuente c es generada por el compilador y no escrita por el usuario. Sun Studio y especialmente Visual Studio mejoraron mucho el tiempo de construcción. En gcc empeoraba aún sin encabezados precompilados. Esto fue con 3.4 no has testet con 4.x pero la velocidad y gcc son mutuamente excluyentes. – Lothar

+0

@Lothar ¿cuál era el código? Encuentro g ++ aproximadamente 10 veces más rápido que los compiladores recientes de Visual Studio, en algunos códigos con muchas plantillas. –

+0

No estoy usando plantillas en mi código C++. Es solo manejo de excepciones C + + bonitas extensiones de C++. Incluso ahora, 6 años después de esta pregunta VS2010 es una magnitud más rápida. Pero mientras tanto tengo 16 núcleos para poder vivir con eso. – Lothar

Respuesta

6

He conseguido encabezados precompilados que trabaja bajo gcc una vez en el pasado, y yo recuerdo haber problemas en ese momento también. Lo que hay que recordar es que gcc ignorará el archivo (header.h.gch o similar) si no se cumplen ciertas condiciones, una lista de la que se puede encontrar en la gcc precompiled header documentation page.

Generalmente es más seguro tener su sistema de construcción compilar el archivo .gch como un primer paso, con las mismas opciones de línea de comandos y ejecutables como el resto de su fuente. Esto asegura que el archivo esté actualizado y que no haya diferencias sutiles.

Probablemente también sea una buena idea hacerlo funcionar primero con un ejemplo artificial, solo para eliminar la posibilidad de que sus problemas sean específicos del código fuente de su proyecto.

4

llamada gcc misma manera como usted lo llama para su archivo de origen pero con un archivo de cabecera.

p. Ej.

g++ $(CPPFLAGS) test.h 

Esto genera un archivo llamado test.h.gch

búsquedas gcc Cada vez test.h para que se vea por primera vez para test.h.gch y si encuentra que se utiliza de forma automática.

Más información se puede encontrar bajo GCC Precompiled Headers

+0

Estoy usando gcc 3.4 y la línea g ++ stdafx.h no compilará, obtendrá el error "g ++: compilación del archivo de encabezado solicitado", pero esto se compilará, aunque no estoy seguro si eso es lo que quiero: "g ++ -c - x C++ stdafx.h -o stdafx.h.pch " – stefanB

46

Firstly, see the documentation here.

Compila encabezados como cualquier otro archivo pero coloca la salida dentro de un archivo con un sufijo de .gch.

Así por ejemplo, si precompila stdafx.hy tendrá un encabezado precompilado que se buscan automáticamente llamada stdafx.h.gch en cualquier momento que incluya stdafx.h

Ejemplo:

stdafx.hy:

#include <string> 
#include <stdio.h> 

a.cpp:

#include "stdafx.h" 
int main(int argc, char**argv) 
{ 
    std::string s = "Hi"; 
    return 0; 
} 

A continuación, los datos como:

> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out

Su compilación funcionará incluso si se quita stdafx.hy después del paso 1.

+1

¡Gracias por dar un ejemplo de trabajo! – nobar

51

definitivamente he tenido éxito. En primer lugar, he utilizado el siguiente código:


#include <boost/xpressive/xpressive.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost::xpressive; 

//A simple regex test 
int main() 
{ 
    std::string hello("hello world!"); 

    sregex rex = sregex::compile("(\\w+) (\\w+)!"); 
    smatch what; 

    if(regex_match(hello, what, rex)) 
    { 
     std::cout << what[0] << '\n'; // whole match 
     std::cout << what[1] << '\n'; // first capture 
     std::cout << what[2] << '\n'; // second capture 
    } 
    return 0; 
} 

Esto fue sólo un hola mundo de Boost Xpressive (ver más abajo para el enlace).Primero, compilé con la opción -H en gcc. Mostraba una enorme lista de encabezados que usaba. Entonces, tomé un vistazo a las banderas de compilación mi IDE (Code :: Blocks) estaba produciendo y vi algo como esto:

g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o

Así que escribió un comando para compilar el archivo Xpressive.hpp con la exacta mismas banderas:

sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp

que compilan el código original de nuevo con el -H y consiguieron este resultado:

 
g++ -Wall -fexceptions -H -g  -c main.cpp -o obj/Debug/main.o 
! /usr/local/include/boost/xpressive/xpressive.hpp.gch 
main.cpp 
. /usr/include/c++/4.4/iostream 
.. /usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h 
.. /usr/include/c++/4.4/ostream 
.. /usr/include/c++/4.4/istream 
main.cpp 

¡El! significa que el compilador pudo usar el encabezado precompilado. Una x significa que no fue capaz de usarlo. Usar los indicadores de compilación apropiados es crucial. Me quité el -H y realicé algunas pruebas de velocidad. El encabezado precompilado tuvo una mejora de 14 segundos a 11 segundos. No esta mal, pero tampoco grandioso.

Nota: Aquí está el enlace al ejemplo: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples No pude conseguir que funcione en la publicación.

BTW: estoy usando el siguiente g ++

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

+0

Total de salvavidas, muchas gracias! –

+16

Agregar -Winvalid-pch lo ayudará a depurar si y por qué algo va mal en el uso de PCH. – lefticus

+0

Gracias por esta información, ¡muy útil! –

6

Para generar el PCH en lugar de utilizar -x c++ uso -x c++-header.

pch.h:

<put your common include files here> 

pch.cpp:

#include "pch.h" 

generar PCH:

g++ -x c++-header -o pch.h.gch -c pch.cpp 

El pch.h.gch debe estar en el mismo directorio que el pch.h!

+0

Esto debería ser '-c pch.h', no' -c pch.cpp'? –

Cuestiones relacionadas