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:
- 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>
- Compile prefix_header.h
% g++ prefix_header.h $(pkg-config gtkmm-2.4 cairo --cflags)
- 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++.
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