Alguém teve algum sucesso em conseguir cabeçalhos pré-compilados trabalhando com o GCC? Não tive sorte em minhas tentativas e não vi muitos bons exemplos de como configurá-lo. Eu tentei no cygwin gcc 3.4.4 e usando 4.0 no Ubuntu.
c++
gcc
precompiled-headers
Lee Baldwin
fonte
fonte
Respostas:
Definitivamente tive sucesso. Primeiro, usei o seguinte código:
Este foi apenas um hello world da Boost Xpressive (veja o link abaixo). Primeiro, compilei com a
-H
opção do gcc. Ele mostrou uma lista enorme de cabeçalhos usados. Então, eu dei uma olhada nos sinalizadores de compilação que meu IDE (code :: blocks) estava produzindo e vi algo assim:g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
Então, escrevi um comando para compilar o arquivo Xpressive.hpp com exatamente as mesmas sinalizações:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
Compilei o código original novamente com o
-H
e obtive esta saída:O ! significa que o compilador foi capaz de usar o cabeçalho pré-compilado. Um x significa que não foi possível usá-lo. Usar os sinalizadores de compilador apropriados é crucial. Tirei o -H e fiz alguns testes de velocidade. O cabeçalho pré-compilado teve uma melhora de 14 segundos para 11 segundos. Não é ruim, mas não é ótimo.
Observação: aqui está o link para o exemplo: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples Não consegui fazê-lo funcionar no postar.
BTW: estou usando o seguinte g ++
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
fonte
-Winvalid-pch
para certificar-se de que o cabeçalho pré-compilado está sendo usado corretamente? Notamos uma grande melhoria usando pch para nossas compilações de depuração, então eu me pergunto se há um problema com sua configuração.Em primeiro lugar, consulte a documentação aqui .
Você compila cabeçalhos como qualquer outro arquivo, mas coloca a saída dentro de um arquivo com o sufixo
.gch
.Então, por exemplo, se você pré-compilar stdafx.h, você terá um cabeçalho pré-compilado que será automaticamente procurado, chamado
stdafx.h.gch
sempre que você incluirstdafx.h
Exemplo:
stdafx.h:
a.cpp:
Em seguida, compile como:
Sua compilação funcionará mesmo se você remover stdafx.h após a etapa 1.
fonte
O
-x
especificador para cabeçalhos pré-compilados C ++ é-x c++-header
, não-x c++
. Segue-se um exemplo de uso de PCH.pch.h
:main.cpp
:Gere o PCH assim:
O
pch.h.gch
deve estar no mesmo diretório que opch.h
para ser usado, portanto, certifique-se de executar o comando acima no diretório ondepch.h
está.fonte
-c pch.h
, não-c pch.cpp
?Consegui fazer com que cabeçalhos pré-compilados funcionassem sob gcc uma vez no passado, e lembro-me de ter tido problemas também. A coisa a lembrar é que o gcc irá ignorar o arquivo (header.h.gch ou similar) se certas condições não forem atendidas, uma lista das quais pode ser encontrada na página de documentação do cabeçalho pré-compilado do gcc .
Geralmente, é mais seguro fazer com que seu sistema de compilação compile o arquivo .gch como uma primeira etapa, com as mesmas opções de linha de comando e executáveis do resto de sua fonte. Isso garante que o arquivo esteja atualizado e que não haja diferenças sutis.
Provavelmente também é uma boa ideia fazê-lo funcionar com um exemplo inventado primeiro, apenas para remover a possibilidade de que seus problemas sejam específicos ao código-fonte do seu projeto.
fonte
Chame o gcc da mesma maneira que o chama para o arquivo de origem, mas com um arquivo de cabeçalho.
por exemplo
isso gera um arquivo chamado test.h.gch
Cada vez que o gcc procura por test.h, ele procura primeiro por test.h.gch e, se o encontrar, o usa automaticamente.
Mais informações podem ser encontradas em Cabeçalhos pré-compilados do GCC
fonte
Tenha certeza de
-include your_header.h
É assim que eu pré-compilei e usei a
bits/stdc++.h
coleção.Código
Então eu localizei a lib compilando meu arquivo com -H e olhando a saída
onde eu vi
Então criei um novo diretório
bits
dentro do atual e copieistdc++.h
de lá.Então eu corri
que gerou
bits/stdc++.gch
Normalmente eu compilei meu código via
, mas eu tive que modificar isso para
já que só resolveu
.gch
arquivar em vez de.h
com-include bits/stdc++.h
Isso foi fundamental para mim. Outra coisa a se manter em mente é que você deve compilar o*.h
arquivo de cabeçalho com quase os mesmos parâmetros que compila o seu*.cpp
. Quando não incluí-O3
ou-pthread
ignorei o*.gch
cabeçalho pré - compilado.Para verificar se tudo está correto, você pode medir a diferença de tempo comparando o resultado de
ou correr
novamente e procure por caminhos de cabeçalho e se agora você obtiver
!
antes do caminho da biblioteca, por exemplofonte