Pergunta

Eu tenho uma solução com muitos projetos Visual C ++, todos usando PCH, mas alguns têm especial compilador interruptores ligado para as necessidades específicas do projeto.

A maioria desses projetos compartilham o mesmo conjunto de cabeçalhos em suas respectivas stdafx.h (STL, impulso, etc). Eu estou querendo saber se é possível PCH share entre os projetos, de modo que em vez de compilar todas as PCH por projeto que eu poderia talvez ter uma PCH comum que a maioria dos projetos na solução só poderia usar.

Parece possível especificar a localização da PCH como um local compartilhado nas configurações do projeto, então eu tenho um palpite isso poderia funcionar. Eu também estou assumindo que todos os arquivos de origem em todos os projetos que usam uma PCH compartilhada teria que ter as mesmas configurações do compilador, ou então o compilador iria reclamar sobre inconsistências entre a PCH eo arquivo de origem a ser compilados.

Alguém já tentou isso? Será que funciona?

A questão relacionada: deve tal PCH caco ser excessivamente inclusive, ou faria que o tempo de construção em geral mal? Por exemplo, uma PCH compartilhada pode incluir muitos dos cabeçalhos STL que são amplamente utilizados, mas alguns projecst pode precisar apenas <string> e <vector>. Será que o tempo economizado usando uma PCH compartilhada tem que ser pago de volta em um momento posterior no processo de compilação quando o otimizador teria que descartar todo o material não utilizado arrastado para o projeto pela PCH?

Foi útil?

Solução

Sim, é possível e eu posso assegurá-lo, a economia de tempo são significativas. Quando você compilar seu PCH, você tem que copiar os arquivos .pdb e .idb do projeto que está criando o arquivo PCH. No meu caso, eu tenho um projeto simples de dois arquivo que está criando um arquivo PCH. O cabeçalho será o seu cabeçalho PCH ea fonte será dito para criar o PCH sob configurações do projeto - este é semelhante ao que você faria normalmente em qualquer projeto. Como você mencionou, você tem que ter as mesmas configurações de compilação para cada configuração de outra forma uma discrepância surgirão eo compilador vai reclamar.

Copiar os arquivos mencionados acima cada vez que há uma reconstrução ou cada vez que o PCH é recompilados vai ser uma dor, por isso vamos automatizar. Para automatizar copiar, executar um evento de pré-compilação onde os arquivos mencionados acima são copiados para o diretório apropriado. Por exemplo, se você está compilando Debug e Release constrói de sua PCH, copiar os arquivos do Debug do seu projeto PCH até Debug do seu projeto dependente. Assim, um comando de cópia ficaria assim

copiar PchPath \ Debug * .pdb Debug \ / Y

Observe o /-Y no final. Após a primeira compilação, cada build subseqüente é incrementalmente compilado, portanto, se você substituir os arquivos novamente, Visual Studio irá queixar-se símbolos corrompidos. Se eles fazem ficar corrompido, você pode sempre realizar uma reconstrução, que irá copiar os arquivos novamente (desta vez não irá ignorá-los como eles não existem mais - a limpeza elimina os ficheiros).

Espero que isso ajude. Levei algum tempo para ser capaz de fazer isso, mas valeu a pena. Eu tenho vários projetos que dependem de um quadro grande, ea PCH precisa ser compilado apenas uma vez. Todos os projetos dependentes agora compilar muito rapidamente.

EDIT: Junto com várias outras pessoas, eu testei isso sob VS2010 e VS2012 e parece funcionar corretamente.

Outras dicas

Enquanto isso é uma questão antiga que eu quero dar uma nova resposta que funciona no Visual Studio 2017 e não envolve qualquer tipo de cópia. Apenas desvantagem:. Editar e continuar não funciona mais

Basicamente, você tem que criar um novo projeto para o cabeçalho pré-compilado e têm todos os outros projetos dependem dele. Aqui está o que eu fiz:

Passo a passo:

  1. Crie um novo projeto withnin sua solução que inclui o cabeçalho (chamado pch.h doravante) e um arquivo CPP uma linha que inclui pch.h. O projeto deve criar uma biblioteca estática. Setup o novo projeto para criar um cabeçalho pré-compilados. O arquivo de saída precisa ser acessível por todos os projetos. para mim isso em relação ao IntDir, mas para as configurações padrão que poderia ser em relação ao $ (SolutionDir). O projeto PCH deve ter apenas define todos os outros projectos têm também.

     configurações do projeto PCH

  2. Tenha todos os outros projetos dependem deste novo projeto. Caso contrário, a ordem de construção pode estar errado.

     referências do projeto

  3. Configuração de todos os outros projetos para usar o pch.h. Veja, como os parâmetros do arquivo de saída são os mesmos que no projeto PCH. Adicionais incluem diretórios também precisa apontar para o diretório pch.h. Opcionalmente, você pode forçar incluir o arquivo PCH em cada CPP (ou você incluí-lo manualmente na primeira linha de cada arquivo CPP).

     PCH incluir incluir

    1. Configuração todos os projetos (incluindo o projeto PCH) para usar o mesmo arquivo de símbolo compilador (o arquivo de símbolo vinculador não é afetada). Mais uma vez, no meu exemplo é OutDir mas em sua solução isso pode variar. Tem que apontar para o mesmo arquivo no disco. O formato de informações de depuração precisa ser definido para C7 (ver imagem acima), caso contrário, Visual Studio não será capaz de compilar projetos em paralelo. APO

Espero não esquecer de nada. Para minha solução (130k loc, 160 projectos) esta vantagem de um tempo de compilação de ~ 2: 30 minutos em vez de ~ 3: 30 minutos.

Parece que não é possível porque cada arquivo de origem tem de ser compilado contra o mesmo APO contra o qual a PCH foi compilado. danado.

A resposta de Samaursa funcionou para mim.

Eu também vi este ligação que as obras (olhar para a resposta de Reginald perto do fundo).

Este usa copy enquanto os usos de Reginald xcopy (eu prefiro xcopy). De qualquer forma, graças -. Isso acelerou o meu constrói consideravelmente

Isso soa como um caso de "rendimentos decrescentes" para mim. Suponha incluindo os cabeçalhos comuns directamente resíduos 1 segundo por arquivo.cpp, e cada alvo (DLL / EXE) tem 10 ficheiros CPP. Usando um .pch por alvo, você economiza 10 segundos por alvo. Se o seu projeto inteiro tem 10 alvos, você economiza 1,5 minutos em toda a construção, o que é bom.

Mas, reduzindo-o a um .pch para todo o projeto, você só salvar mais 9 segundos. Vale a pena? O esforço extra (que pode ser muito mais complicadas de configurar, sendo uma configuração não-padrão não suportado por assistentes VS) produz apenas um décimo da economia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top