ejecutar con compilar como c++ gcc precompiled-headers

c++ - compilar - Cabeceras precompiladas con GCC



gcc linux install (5)

Definitivamente tuve éxito. Primero, utilicé 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; }

Este fue solo un mundo de hola de Boost Xpressive (ver a continuación el enlace). Primero, compilé con la opción -H en gcc. Mostraba una enorme lista de encabezados que usaba. Luego, eché un vistazo a los indicadores de compilación que estaba produciendo mi IDE (code :: blocks) y vi algo como esto:

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

Así que escribí un comando para compilar el archivo Xpressive.hpp con las mismas banderas exactas:

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

Recopilé el código original nuevamente con -H y obtuve esta salida:

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

Los ! 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 lograr que funcionara en el enviar.

Por cierto: estoy usando el siguiente g ++

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

¿Alguien tuvo éxito al obtener encabezados precompilados trabajando 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.


He logrado obtener encabezados precompilados que funcionan bajo gcc una vez en el pasado, y recuerdo haber tenido problemas 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 las cuales puede encontrarse en la página de documentación del encabezado precompilado de gcc .

Por lo general, es más seguro que el sistema compile el archivo .gch como primer paso, con las mismas opciones de línea de comandos y ejecutable que el resto de la 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.


Llame a gcc de la misma manera que lo llama para su archivo de origen, pero con un archivo de encabezado.

p.ej

g++ $(CPPFLAGS) test.h

esto genera un archivo llamado test.h.gch

Cada vez que gcc busca test.h, primero busca test.h.gch y si lo encuentra lo usa automáticamente.

Se puede encontrar más información en los encabezados precompilados de GCC


Para generar el pch en lugar de usar -x c++ use -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!


Primero, mira la documentación aquí .

Compila encabezados como cualquier otro archivo pero coloca el resultado dentro de un archivo con un sufijo de .gch .

Por ejemplo, si precompila stdafx.h, tendrá un encabezado precompilado que se buscará automáticamente llamado stdafx.h.gch cualquier momento que incluya stdafx.h

Ejemplo:

stdafx.h:

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

a.cpp:

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

Luego compila como:

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

Tu compilación funcionará incluso si eliminas stdafx.h después del paso 1.