Ferramenta para rastrear #include dependencies [closed]


175

Alguma boa sugestão? Entrada será o nome de um arquivo de cabeçalho e a saída deve ser uma lista (de preferência uma árvore) de todos os arquivos, incluindo-o direta ou indiretamente.


4
Não se trata de uma inclusão "favorita", é mostrada muito bem no gcc, mas o msvs não. Então, nós (I) estamos procurando por qualquer ferramenta.
fantastory

70
Por que continuo achando perguntas "fora do tópico" tão úteis?
Jfritz42 # 30/15

5
@ jfritz42: Este deve receber o prêmio "Comentário do ano"! Como um moderador pode rotular uma pergunta de "fora do tópico" quando há tantos tópicos e tantos usuários?
Totoro 14/07

2
Eu queria observar que existem muito mais ferramentas para lidar com #includedependências como cpp-dependencies , iwyu e dep-matrix, que é uma ferramenta bastante ingênua, escrita em python.
Nonsensickle

3
@ jfritz42 Os números são claros: 123 votos e 62 favoritos. Muitas pessoas vêem assim. Padrões estranhos de SO. Também duvido que essas perguntas tenham as mesmas ótimas respostas no SuperUser.
Andreas

Respostas:


148

Se você tiver acesso ao GCC / G ++, a -Mopção exibirá a lista de dependências. Ele não faz nada extra que as outras ferramentas fazem, mas como é proveniente do compilador, não há chance de ele pegar arquivos do local "errado".


60
-Haté dá uma árvore!
SamB 13/10/11

28
-MMignora os cabeçalhos do sistema
TheJosh

3
Também com a -oopção, o compilador escreverá a saída no arquivo em vez de stdout.
Hi-Angel

2
@ SamB Isso funciona apenas se não houver erros e será impresso em stderrvez de stdout. Caso contrário, esta opção é mais geral.
user877329

92

Graças ao KeithB. Procurei os documentos para cl.exe (VS2008) e encontrei o sinalizador / showIncludes. No IDE, isso pode ser definido na página de propriedades de qualquer arquivo CPP.

Captura de tela


1
Isso é extremamente útil para solucionar alguns erros / avisos de compilação muito difíceis. Muito obrigado!
Ashwin Nanjappa 19/03/09

Isso também é extremamente útil ao tentar otimizar cabeçalhos pré-compilados!
fmuecke 23/10/2009

Ao trabalhar em VS, eu acho que esta é a solução mais rápida para resolver o meu problema ~ :-)
yaobin

Isso parece não funcionar, se algum cabeçalho incluir um cabeçalho std c, por exemplo,math.h
abergmeier 27/10/15

29

Para uma solução pesada, você deve conferir o doxygen . Ele examina sua base de código e cria um site, efetivamente, que documenta seu código. Uma das muitas coisas que mostra é incluir árvores.

Se você estava procurando ser capaz de conectar a saída dessa ferramenta a algum outro processo, isso pode não funcionar para você (embora o doxygen produza para outros formatos, não estou familiarizado com esse recurso). Se você simplesmente quer observar as dependências, deve funcionar muito bem.


20

Eu brinquei com uma ferramenta chamada cinclude2dot . Foi bastante útil para lidar com uma base de código bastante grande quando cheguei ao trabalho aqui. Na verdade, pensei em integrá-lo à nossa compilação diária.


2
Esta ferramenta funciona excepcionalmente bem. Eu tive problemas com g ++ 's -M e doxygen.
sleeparrow 9/09/16

Eu escrevi um script python para ler a saída do cinclude2dot e obter toda a dependência em um mapa e, em seguida, fazer a profundidade da primeira travessia para finalmente gerar uma floresta de fontes. A floresta que não possui nenhum .cc/.c/.cxxarquivo (apenas os .harquivos) pode ser redundante.
shuva 13/02/2019

12

Primeiro, cinclude2dot.pl é um script perl que analisa o código C / C ++ e produz um gráfico de dependência #include como um arquivo de ponto para entrada no graphviz.

http://www.flourish.org/cinclude2dot/

Se você não deseja seguir esse tipo de ferramenta manual, o vencedor de longe é, na minha opinião, uma ferramenta conhecida como "IncludeManager" do ProFactor.

http://www.profactor.co.uk/includemanager.php

Há uma avaliação gratuita e é incrível. É um plug-in para o Visual Studio totalmente integrado, portanto, clicar duas vezes em algo aqui leva você ao local em que está incluído ali.

Passe o mouse sobre a dica de ferramenta fornece todas as informações que você deseja e permite aprofundar / remover, remover subárvores inteiras de que você não gosta, ver representações que não sejam gráficos, percorrer uma lista de correspondências para isso e aquilo, é maravilhoso.

Se você for rápido, refatorar a #include estrutura de grandes projetos antes que a avaliação seja concluída. Mesmo assim, não custa muito, cerca de US $ 35 por licença.

Para o que faz, é quase perfeito. Não apenas #include gráficos, mas também cruzam dependências do projeto de arquivos compartilhados, impacto nos tempos de construção, propriedades detalhadas nas grades, perfeitas.


Eu usei com sucesso o IncludeManager no meu projeto C. Eu estou usando o Visual Studio 2013.
smwikipedia

Meio desconfiado.
Sdd

12

Boas notícias: redhat Source-Navigator (também roda no Windows). Obviamente, as opções do compilador (mencionadas anteriormente) têm uma análise superior e não tenho certeza de como isso manipulará MFC, Qt e suas palavras-chave mágicas.

redhat Source-Navigator


5

Com base na resposta do KeithB , aqui está a sintaxe do GNUmake para automaticamente 1) gerar os arquivos de dependência, 2) mantê-los atualizados e 3) usá-los em seu makefile:

.dep:
    mkdir $@
.dep/%.dep: %.c .dep
    (echo $@ \\; $(CC) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
.dep/%.dep: %.cpp .dep
    (echo $@ \\; $(CXX) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
DEPEND := $(patsubst %.dep,.dep/%.dep,$(OBJ:.o=.dep))
-include $(DEPEND)

(Certifique-se de alterar esses recuos para hardtabs.)





Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.