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.

Agnel Kurian
fonte
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".

KeithB
fonte
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

Agnel Kurian
fonte
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.

Matt Dillard
fonte
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.

Brian Stewart
fonte
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.

Allbite
fonte
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

Agnel Kurian
fonte
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.)

cxw
fonte
3

O Understanding C ++ deve poder ajudá-lo: ele cria um banco de dados que você pode acessar do Perl.

Xavier Nodet
fonte
Entender é comercial, mas é incrível IMO. Você pode experimentá-lo gratuitamente.
skelliam
1

O cscope ( http://cscope.sourceforge.net/ ) faz isso em um xterm independente e também pode ser usado dentro do seu editor favorito - ele possui ótimo suporte ao emacs e ao vi / vim.

svec
fonte