Pergunta

No momento, estamos usando uma única ferramenta de linha de comando para construir o nosso produto em Windows e Linux.

Si muito seus trabalhos muito bem, o que nos permite construir fora da fonte e com dependências mais finos do que o que qualquer um de nosso sistema de compilação anterior permitido. Isso nos compras grandes incrementais e construir paralelo capacidades.

Para descrever brevemente o processo de construção, temos a habitual:

.cpp -- cl.exe --> .obj and .pdb
multiple .obj and .pdb -- cl.exe --> single .dll .lib .pdb
multiple .obj and .pdb -- cl.exe --> single .exe .pdb

O msvc C / C ++ compilador suportes lo adequadamente.

Recentemente, a necessidade de construir algumas bibliotecas estáticas emergiu. Pelo que nos reunimos, o processo para construir uma biblioteca estática é:

multiple .cpp -- cl.exe --> multiple .obj and a single .pdb
multiple .obj -- lib.exe --> a single .lib

Os meios PDB único que cl.exe só deve ser executado uma vez para todas as fontes .cpp. meio deste único de execução que não podemos paralelizar a construção para esta biblioteca estática. Este é realmente lamentável.

Nós investigamos um pouco mais e de acordo com a documentação (e as opções de linha de comando disponíveis):

  • cl.exe não sabe como construir bibliotecas estáticas
  • lib.exe não sabe como construir .pdb

Alguém sabe uma maneira de mesclar vários arquivos PDB? Estamos condenados a ter constrói lento para bibliotecas estáticas? Como ferramentas como IncrediBuild contornar esse problema?

Foi útil?

Solução

Eu não fiz C ++ por um longo tempo, mas a partir desta artigo , parece que este é um truque desempenho para parar a recriação de símbolos para cabeçalhos comuns.

Você poderia tentar / Z7 para info incorporar em cada obj, e não criar um link APO e, em seguida, e recriá-lo com um rebase como neste artigo .

Outras dicas

Não há necessidade de arquivos PDB mesclagem.

arquivos de origem compilar com / Z7 para evitar a criação de um APO durante as etapas de CL.EXE.

Use LIB.EXE para criar libaries estáticas com informações de depuração incorporado. Use LINK.EXE vez de CL.EXE a ligação, utilize / PDB para especificar onde as informações de depuração vai.

Se você está depurando um processo com um EXE e um ou mais DLLs, alimentar o seu depurador um APO para cada imagem (EXE ou DLL).

arquivos de mesclagem PDB são possíveis, mas só pode ser feito por cl.exe e link.exe. Eu não sei quaisquer ferramentas standlone para fundir arquivos PDB.

Você pode usar / PDB opção de vinculador (eu verifiquei VC2005) para especificar o nome do arquivo PDB alternativo.

Microsoft sugere incluir também arquivos PDB (cada obj tem um arquivo PDB correspondente) juntamente com ficheiro.LIB.

Você não pode arquivos PDB arquivo dentro ficheiro.LIB, eu tentei com VC2003, falhou.

Compilar com / Z7 pode evitar arquivos PDB para .LIB, mas arquivos objeto são grandes, a menos que o Link.exe tira as informações de depuração. Se você não tem a opção / debug para vinculador, então a sua exe / dll não pode ser depurado.

Compiler (cl.exe) sempre gravar no arquivo vcXX.pdb a menos que você use a opção / Fd para especificar outro nome. Mesmo quando você usa cl.exe para produzir um executável "diretamente", Ela vai produzir um arquivo vc80.pdb e então o Link.exe irá produzir o nome do arquivo pdb mesmo que o executável.

cl / Zi test.c

cl.exe -> vc80.pdb Link.exe ler vc80.pdb (o nome é incorporado em test.obj arquivo) -> test.pdb

Cada vez cl / Zi / c compilar um arquivo, ele vai tentar modificar o arquivo vcXX.pdb existente em vez de substituí-lo.

Eu tenho a conslusion acima pelo jogo com o compilador de novo e de novo, então resultado procexp das sysinternals captura e analisá-lo. Espero que ajude.

A menos que você quiser redistribuir as bibliotecas estáticas com informações de depuração, você realmente não precisa se fundir quaisquer arquivos PDB (ou use /Z7 para incorporar a informação de depuração).

Como @zhaorufei mencionado, quando se utiliza /Zi, cada ficheiro de objecto contém uma referência ao seu arquivo APO, que, em seguida, o ligante usos.

Basta usar /Fd para dar a cada objeto um arquivo PDB única:

> cl -c foo.cpp -Fo:target/foo.obj -Fd:target/foo.pdb -Zi
> cl -c bar.cpp -Fo:target/bar.obj -Fd:target/bar.pdb -Zi

> strings target/foo.obj | grep pdb
D:\Dev\sample\target\foo.pdb
> strings target/bar.obj | grep pdb
D:\Dev\sample\target\bar.pdb

Isto também tem a vantagem de que ele funciona em torno das questões de acesso simultâneo a APO compartilhado arquivos mencionados aqui , assim você pode paralelizar a etapa de compilação como você queria.

link Em seguida / arquivar os arquivos de objetos, como de costume. VC ++ já incorpora vários tipos de informações nos arquivos de objeto para passá-las para o vinculador, tais como a configuração e dependência bibliotecas de ligação de tempo de execução - o caminho do arquivo PDB não é diferente. Criando uma biblioteca estática dos objetos não remove as referências:

> lib -out:target/all.lib target/foo.obj target/bar.obj
> strings target/all.lib | grep pdb
D:\Dev\sample\target\bar.pdb
D:\Dev\sample\target\foo.pdb

Ao vincular esta biblioteca para um executável ou DLL, o vinculador ainda puxa a informação de depuração das PDBs referenciados e adiciona-lo para o arquivo PDB final.

A única ressalva que eu posso ver é que o caminho é sempre absoluto, de modo que este pode não funcionar se você mover os arquivos em torno localmente ou para outra máquina antes de ligar.

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