Outil pour suivre les dépendances #include [fermé]

175

Des bonnes suggestions? L'entrée sera le nom d'un fichier d'en-tête et la sortie devrait être une liste (de préférence un arbre) de tous les fichiers y compris directement ou indirectement.

Agnel Kurian
la source
4
Il ne s'agit pas d'un "favori", les inclusions sont bien montrées dans gcc, mais pas msvs. Nous (je) recherchons donc n'importe quel outil.
fantastique
70
Pourquoi est-ce que je continue de trouver des questions «hors sujet» si utiles?
jfritz42
5
@ jfritz42: Cela devrait recevoir le prix "Commentaire de l'année"! Comment un modérateur peut-il étiqueter une question «hors sujet» alors qu'il y a tant de sujets et tant d'utilisateurs?
Totoro le
2
Je voulais noter qu'il existe de nombreux autres outils pour gérer les #includedépendances telles que les dépendances cpp , iwyu et dep-matrix qui est un outil assez naïf écrit en python.
nonsensickle
3
@ jfritz42 Les chiffres sont clairs: 123 votes et 62 favoris. Beaucoup de gens le voient de cette façon. Normes SO bizarres. Je doute également que de telles questions aient les mêmes bonnes réponses sur SuperUser.
Andreas

Réponses:

148

Si vous avez accès à GCC / G ++, l' -Moption affichera la liste de dépendances. Il ne fait aucune des choses supplémentaires que font les autres outils, mais comme il vient du compilateur, il n'y a aucune chance qu'il récupère les fichiers au «mauvais» endroit.

KeithB
la source
60
-Hdonne même un arbre!
SamB
28
-MMsaute les en
TheJosh
3
Aussi avec l' -ooption, le compilateur va écrire la sortie dans un fichier au lieu de stdout.
Hi-Angel
2
@SamB Cela ne fonctionne que s'il n'y a pas d'erreurs et imprime à la stderrplace de stdout. Sinon, cette option est plus générale.
user877329
92

Merci à KeithB. J'ai recherché la documentation pour cl.exe (VS2008) et j'ai trouvé l'indicateur / showIncludes. Depuis l'EDI, cela peut être défini à partir de la page de propriétés de n'importe quel fichier CPP.

Capture d'écran

Agnel Kurian
la source
1
Ceci est extrêmement utile pour résoudre certaines erreurs / avertissements de compilation très difficiles. Merci beaucoup!
Ashwin Nanjappa
Ceci est également extrêmement pratique lorsque vous essayez d'optimiser les en-têtes précompilés!
fmuecke
Lorsque vous travaillez dans VS, je pense que c'est la solution la plus rapide pour résoudre mon problème ~ :-)
yaobin
Cela ne semble pas fonctionner, si un en-tête inclut un en-tête std c, par exemplemath.h
abergmeier
29

Pour une solution lourde, vous devriez consulter doxygen . Il scanne votre base de code et propose un site Web, efficacement, qui documente votre code. L'une des nombreuses choses qu'elle montre est l'inclusion des arbres.

Si vous cherchez à pouvoir brancher la sortie de cet outil dans un autre processus, cela peut ne pas fonctionner pour vous (bien que doxygen produise vers d'autres formats, je ne suis pas vraiment familier avec cette fonctionnalité). Si vous voulez simplement observer les dépendances, cela devrait fonctionner parfaitement.

Matt Dillard
la source
20

J'ai joué avec un outil appelé cinclude2dot . C'était assez utile pour avoir une idée d'une base de code assez volumineuse lorsque je suis venu travailler ici. J'ai en fait pensé à l'intégrer dans notre version quotidienne.

Brian Stewart
la source
2
Cet outil fonctionne exceptionnellement bien. J'ai eu des problèmes avec -M et doxygen de g ++.
sleeparrow
J'ai écrit un script python pour lire la sortie de cinclude2dot et obtenir toutes les dépendances dans une carte, puis effectuer une traversée en profondeur pour enfin générer une forêt de sources. La forêt qui ne contient aucun .cc/.c/.cxxfichier (seuls les .hfichiers qu'elle contient ) peut être redondante.
shuva
12

Tout d'abord, cinclude2dot.pl est un script perl qui analyse le code C / C ++ et produit un graphe de dépendances #include sous forme de fichier de points à saisir dans graphviz.

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

Si vous ne voulez pas suivre la voie de ce genre d'outil manuel, alors le gagnant de loin est à mon avis un outil connu sous le nom de "IncludeManager" de ProFactor.

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

Il y a un essai gratuit et c'est génial. C'est un plug-in pour Visual Studio qui est totalement intégré, donc double-cliquer sur quelque chose ici vous amène à l'endroit où il est inclus là-bas.

Les survols de la souris dans les info-bulles vous donnent toutes les informations que vous souhaitez, et vous permettent de faire un zoom avant / arrière, de supprimer des sous-arbres entiers dont vous ne vous souciez pas, d'afficher des représentations autres que des graphiques, de parcourir une liste de correspondances pour ceci et cela, c'est merveilleux.

Si vous êtes rapide, vous pouvez refactoriser la structure #include d'un grand projet avant la fin de la période d'essai. Même ainsi, cela ne coûte pas beaucoup, environ 35 $ par licence.

Pour ce qu'il fait, c'est presque parfait. Non seulement #include des graphiques, mais aussi les dépendances entre les projets des fichiers partagés, l'impact sur les temps de construction, les propriétés détaillées dans les grilles, parfait.

Allbite
la source
J'ai utilisé avec succès IncludeManager dans mon projet C. J'utilise Visual Studio 2013.
smwikipedia
Un peu suspect.
sdd
12

Bonne nouvelle: redhat Source-Navigator (fonctionne également sous Windows). Bien sûr, les commutateurs du compilateur (mentionnés précédemment) ont une analyse supérieure et je ne sais pas comment cela gérera MFC, Qt et leurs mots-clés magiques.

redhat Source-Navigator

Agnel Kurian
la source
5

S'appuyant sur la réponse de KeithB , voici la syntaxe gnumake à automatiquement 1) générer les fichiers de dépendance, 2) les tenir à jour, et 3) les utiliser dans votre 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)

(Assurez-vous de changer ces retraits en hardtabs.)

cxw
la source
3

Comprendre pour C ++ devrait pouvoir vous aider: il crée une base de données à laquelle vous pouvez accéder depuis Perl.

Xavier Nodet
la source
Comprendre est commercial, mais c'est incroyable IMO. Vous pouvez l'essayer gratuitement.
skelliam
1

cscope ( http://cscope.sourceforge.net/ ) fait cela dans un xterm autonome, et peut également être utilisé dans votre éditeur préféré - il a un excellent support emacs et vi / vim.

svec
la source