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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
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.
#include
Abhängigkeiten wie cpp-Abhängigkeiten , iwyu und dep -Matrix gibt, ein ziemlich naives Tool, das in Python geschrieben ist.Antworten:
Wenn Sie Zugriff auf GCC / G ++ haben, gibt die
-M
Option 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.quelle
-H
gibt sogar einen Baum!-MM
überspringt System-Header-o
Option schreibt der Compiler die Ausgabe in eine Datei anstelle von stdout.stderr
stattdessen gedrucktstdout
. Andernfalls ist diese Option allgemeiner.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.
quelle
math.h
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.
quelle
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.
quelle
.cc/.c/.cxx
Datei befindet (nur die darin enthaltenen.h
Dateien), ist möglicherweise redundant.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.
quelle
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.
quelle
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:
(Stellen Sie sicher, dass Sie diese Einrückungen in Hardtabs ändern.)
quelle
Sie können auch makedepend überprüfen :
http://en.wikipedia.org/wiki/Makedepend
http://www.xfree86.org/current/makedepend.1.html
quelle
Understand for C ++ sollte Ihnen helfen können: Es erstellt eine Datenbank, auf die Sie über Perl zugreifen können.
quelle
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.
quelle
Es gibt ein kostenloses Tool Include File Dependencies Watcher
quelle