C++: Pré-compilação de headers no gcc

Palavras-chave: C++, C, C#, precompiled header, prefix header, g++, lento

Se seu programa em C++ demora séculos para compilar, considere usar um recurso do GCC 4 que acelera compilações de maneira bastante simples.

Um dos motivo porque programas C++ demoram tanto para compilar é a grande quantidade de headers a se incluir. Um programa com #include <gtkmm.h>, por exemplo, vai incluir literalmente milhares de arquivos, dentre eles os do gtkmm em si, glibmm, pangomm, atkmm, sigc++, gtk+, pango, atk, gdk, glib etc etc etc. Além disso, pela complexidade de linguagem, o processamento de headers C++ é demorado.

Como isso tudo é feito para cada arquivo fonte do programa, no final das contas é bem possível que boa parte do tempo de compilação seja gasto processando esse mesmo grupo de headers tantas vezes quanto o número de arquivos no seu projeto.

No GCC 4 foi incluído o recurso de pré-compilação de headers. Ou seja, você pode pré-compilar os headers em separado para que este passo não precise ser repetido para cada arquivo. Para pré-compilar um cabeçalho, simplesmente rode o gcc nele como se fosse compilar um arquivo fonte comum:

% g++ meuheader.h -I/path/para/diretorios/de/includes

(se tudo der certo, um arquivo meuheader.h.gch será gerado)

Se o gcc encontrar a versão pré-compilada de um header enquanto procura por ele, esta será usada. Uma forma simples de se usar esse recurso no seu projeto é pré-compilar um “prefix header” que será automaticamente incluído no começo de todos os arquivos fonte de seu programa. Este arquivo deve conter #includes para todos os headers que seu programa precisa.

Segue uma receita de bolo para usar prefix headers pré-compilados:

  1. Crie um arquivo (por exemplo, prefix_header.h) que inclua todos os headers de bibliotecas que seu programa usa, ex.:
    #include <list>
    #include <vector>
    #include <string>
    #include <map>
    #include <gtkmm.h>
    #include <cairo.h>
    #include <math.h>
    
  2. Compile prefix_header.h
    % g++ prefix_header.h $(pkg-config gtkmm-2.4 cairo --cflags)
    
  3. Compile seu programa usando o prefix header
    % make "CXXFLAGS=-include prefix_header.h"
    

Isso também funciona em C e Objective-C, mas a maior diferença pode ser notada no C++.

This entry was posted in CPP. Bookmark the permalink.

One Response to C++: Pré-compilação de headers no gcc

  1. Gabriel C. says:

    Aproveitando o exemplo usar gtkmm.h gostaria de saber se você (autor) ou alguém aqui já compilou o Gtkmm totalmente estático; alguem já gerou todas as libs estáticas no Windows para o Gtkmm?
    A mais de uma semana tenho passado meus dias criando e configurando projetos do VS2005 para cada lib e minerando por parametros que tornam a compilação estática mas apesar de já até ter conseguido gerar uma versão estática de todas as libs na hora de linkar com a aplicação milhoes de erros de linkagem aparecem por funções das libs ainda estarem compiladas como dll, tem sido uma tarefa árdua, se alguem tiver uma dica sobre o assuntou ou já tiver feito o mesmo e puder me ajudar.
    Abraços

Leave a Reply

Your email address will not be published. Required fields are marked *