Tool zum Verfolgen von #include-Abhängigkeiten [geschlossen]

175

Irgendwelche guten Vorschläge? Eingabe ist der Name einer Header-Datei und Ausgabe sollte eine Liste (vorzugsweise ein Baum) aller Dateien sein, einschließlich dieser direkt oder indirekt.

Agnel Kurian
quelle
4
Es geht nicht darum, dass ein "Favorit" in gcc gut angezeigt wird, msvs jedoch nicht. Also suchen wir (ich) nach einem Werkzeug.
fantastische
70
Warum finde ich "Off-Topic" -Fragen immer so hilfreich?
jfritz42
5
@ jfritz42: Dies sollte die Auszeichnung "Kommentar des Jahres" erhalten! Wie kann ein Moderator eine Frage als "Off Topic" bezeichnen, wenn es so viele Themen und so viele Benutzer gibt?
Totoro
2
Ich wollte darauf hinweisen, dass es viel mehr Tools für den Umgang mit #includeAbhängigkeiten wie cpp-Abhängigkeiten , iwyu und dep -Matrix gibt, ein ziemlich naives Tool, das in Python geschrieben ist.
unsinnig
3
@ jfritz42 Die Zahlen sind klar: 123 Stimmen und 62 Favoriten. Viele Leute sehen das so. Seltsame SO-Standards. Ich bezweifle auch, dass solche Fragen auf SuperUser die gleichen großartigen Antworten haben würden.
Andreas

Antworten:

148

Wenn Sie Zugriff auf GCC / G ++ haben, gibt die -MOption die Abhängigkeitsliste aus. Es macht nichts von den zusätzlichen Dingen, die die anderen Tools machen, aber da es vom Compiler kommt, besteht keine Chance, dass es Dateien vom "falschen" Ort abholt.

KeithB
quelle
60
-Hgibt sogar einen Baum!
SamB
28
-MMüberspringt System-Header
TheJosh
3
Auch mit der -oOption schreibt der Compiler die Ausgabe in eine Datei anstelle von stdout.
Hi-Angel
2
@SamB Dies funktioniert nur, wenn keine Fehler vorliegen, und wird stderrstattdessen gedruckt stdout. Andernfalls ist diese Option allgemeiner.
user877329
92

Vielen Dank an KeithB. Ich habe in den Dokumenten nach cl.exe (VS2008) gesucht und das Flag / showIncludes gefunden. In der IDE kann dies auf der Eigenschaftsseite einer beliebigen CPP-Datei festgelegt werden.

Bildschirmfoto

Agnel Kurian
quelle
1
Dies ist äußerst nützlich, um einige sehr schwierige Kompilierungsfehler / Warnungen zu beheben. Vielen Dank!
Ashwin Nanjappa
Dies ist auch äußerst praktisch, wenn Sie versuchen, vorkompilierte Header zu optimieren!
fmuecke
Wenn ich in VS arbeite, denke ich, dass dies die schnellste Lösung ist, um mein Problem zu lösen ~ :-)
yaobin
Dies scheint nicht zu funktionieren, wenn ein Header einen Standard-C-Header enthält, z. B.math.h
abergmeier
29

Für eine schwere Lösung sollten Sie Sauerstoff ausprobieren . Es durchsucht Ihre Codebasis und erstellt effektiv eine Website, die Ihren Code dokumentiert. Eines der vielen Dinge, die es zeigt, sind Bäume.

Wenn Sie die Ausgabe dieses Tools in einen anderen Prozess einbinden möchten, funktioniert dies möglicherweise nicht für Sie (obwohl doxygen in anderen Formaten ausgegeben wird, bin ich mit dieser Funktion nicht wirklich vertraut). Wenn Sie jedoch nur die Abhängigkeiten im Auge behalten möchten, sollte dies hervorragend funktionieren.

Matt Dillard
quelle
20

Ich habe mit einem Tool namens cinclude2dot herumgespielt . Es war ziemlich nützlich, eine ziemlich große Codebasis in den Griff zu bekommen, als ich hier zur Arbeit kam. Ich habe tatsächlich darüber nachgedacht, es irgendwann in unseren täglichen Build zu integrieren.

Brian Stewart
quelle
2
Dieses Tool funktioniert außergewöhnlich gut. Ich hatte Probleme mit g ++ 's -M und Sauerstoff.
Schlafpfeil
Ich habe ein Python-Skript geschrieben, um die Ausgabe von cinclude2dot zu lesen und alle Abhängigkeiten in einer Karte abzurufen. Anschließend habe ich die Tiefenüberquerung durchgeführt, um schließlich eine Gesamtstruktur von Quellen auszugeben. Die Gesamtstruktur, in der sich keine .cc/.c/.cxxDatei befindet (nur die darin enthaltenen .hDateien), ist möglicherweise redundant.
Shuva
12

Erstens ist cinclude2dot.pl ein Perl-Skript, das C / C ++ - Code analysiert und ein # include-Abhängigkeitsdiagramm als Punktdatei für die Eingabe in graphviz erstellt.

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

Wenn Sie sich nicht für ein solches manuelles Tool entscheiden möchten, ist der zweifelsohne Gewinner meiner Meinung nach ein Tool namens "IncludeManager" von ProFactor.

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

Es gibt eine kostenlose Testversion und es ist großartig. Es ist ein Plug-In für Visual Studio, das vollständig integriert ist. Wenn Sie also hier auf etwas doppelklicken, gelangen Sie zu dem Ort, an dem es dort enthalten ist.

Mithilfe von QuickInfos mit QuickInfos erhalten Sie alle gewünschten Informationen. Sie können einen Drilldown durchführen, ganze Teilbäume entfernen, die Sie nicht interessieren, andere Darstellungen als Diagramme anzeigen und eine Liste von Übereinstimmungen für dieses und jenes durchlaufen. Es ist wunderbar.

Wenn Sie schnell sind, können Sie die # include-Struktur eines großen Projekts überarbeiten, bevor die Testversion abläuft. Trotzdem kostet es nicht viel, ungefähr 35 US-Dollar pro Lizenz.

Für das, was es tut, ist es einfach perfekt. Nicht nur # Include-Diagramme, sondern auch projektübergreifende Abhängigkeiten von freigegebenen Dateien, Auswirkungen auf die Erstellungszeiten, detaillierte Eigenschaften in Rastern, perfekt.

Allbite
quelle
Ich habe IncludeManager erfolgreich in meinem C-Projekt verwendet. Ich benutze Visual Studio 2013.
smwikipedia
Ein bisschen verdächtig.
SDD
12

Gute Nachrichten: redhat Source-Navigator (läuft auch unter Windows). Natürlich haben Compiler-Switches (bereits erwähnt) eine überlegene Analyse, und ich bin mir nicht sicher, wie dies mit MFC, Qt und ihren magischen Schlüsselwörtern umgehen wird.

redhat Source-Navigator

Agnel Kurian
quelle
5

Aufbauend auf der Antwort von KeithB gibt es hier die GNUmake-Syntax, um automatisch 1) die Abhängigkeitsdateien zu generieren, 2) sie auf dem neuesten Stand zu halten und 3) sie in Ihrem Makefile zu verwenden:

.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)

(Stellen Sie sicher, dass Sie diese Einrückungen in Hardtabs ändern.)

cxw
quelle
3

Understand for C ++ sollte Ihnen helfen können: Es erstellt eine Datenbank, auf die Sie über Perl zugreifen können.

Xavier Nodet
quelle
Verstehen ist kommerziell, aber es ist unglaublich IMO. Sie können es kostenlos ausprobieren.
Skelliam
1

cscope ( http://cscope.sourceforge.net/ ) erledigt dies in einem eigenständigen xterm und kann auch in Ihrem Lieblingseditor verwendet werden - es bietet großartige Emacs und vi / vim-Unterstützung.

svec
quelle