Ich arbeite an einem mittelgroßen C/C++-Projekt, auf das ich bereits Doxygen+Graphviz angewendet habe. Seine Header-Grafiken sind nützlich, aber sie zeigen nur Beziehungen basierend auf #include
. Ich bin daran interessiert, ein (vorzugsweise Linux-basiertes) Tool zu finden, das Dateiabhängigkeiten nicht nur basierend auf analysiert #include
, sondern auf die tatsächliche Symbolverwendung. Ein solches Tool würde beispielsweise nicht nur das zeigen a.cpp
beinhaltet b.h
aber das a.cpp
Verwendet SomeClass
das ist deklariert in c.h
eingeschlossen von b.h
. Es wäre auch in der Lage, Header-Includes vorzuschlagen, die gekürzt werden könnten.
“Tiefe” Header-Abhängigkeitsanalyse
Reinderien
richq
Ich habe verwendet Geben Sie an, was Sie verwenden zuvor mit ziemlich guten Ergebnissen. Es verwendet Clang, um den C++-Code zu parsen und Forward-Deklarationen zum Hinzufügen und Header-Dateien zum Entfernen vorzuschlagen.
Ein Nachteil ist, dass Annahmen über das Layout Ihres Codes getroffen werden – im Grunde die Google-Codierungsstandards. Es wird also nur zugeschaut SomeFile.h
wenn Sie eine Datei namens haben SomeClass.cpp
. Auch die vorgeschlagenen Includes verwenden vollständige Pfade aus dem Stammverzeichnis Ihres Projekts (so #include "src/SomeClass.h"
Anstatt von #include "SomeClass.h"
). Am Ende habe ich meinen Code trotzdem auf diese Konvention geändert, da dies Mehrdeutigkeiten vermeidet, aber es braucht eine Warnung, falls Sie es versuchen.
Normalerweise kann man einfach einstellen CC=include-what-you-use
und neu erstellen, um die Ergebnisse zu erhalten – es verwendet die gesamte Clang-Maschinerie zum Analysieren -I
Argumente beinhalten. Es gibt ein Python-Programm, das das Ergebnis verwendet, um Ihre #include-Zeilen automatisch zu aktualisieren.
BEARBEITEN:
Ein weiteres Tool, das nicht so ausgefeilt ist, aber einfacher einzurichten ist und Vorschläge machen kann #include
s zu entfernen ist Enthaupter. Es funktioniert, indem Sie Ihre C++-Datei an einen temporären Speicherort kopieren und eine #include
und neu kompilieren. Wenn die Neukompilierung funktioniert, ist es sicher, diese Header-Datei zu entfernen. Was es nicht tut, ist Vorwärtsdeklarationen oder irgendetwas Ausgefallenes vorzuschlagen, aber es kann unnötige Include-Zeilen in Ihren Implementierungsdateien reduzieren.
-
Es scheint vielversprechend, obwohl es ein echter Schmerz ist, dass es keine zu installierenden Binärdateien hat. Und als ich anfing, llvm zu kompilieren, füllte es meine Festplatte bis zur Kapazitätsgrenze.
– Reinderien
4. Mai 2011 um 21:38 Uhr
-
@Reinderien Ein Auschecken und Erstellen von llvm + clang ist “nur” etwa 1 GB groß. Denken Sie daran, –enable-optimized an das Konfigurationsskript zu übergeben. Ein Debug-Build wird Sie auf etwa 4 GB zurücksetzen.
– richq
5. Mai 2011 um 7:07 Uhr
-
Ich konnte endlich IWYU bauen – und ja, es ist sperrig, aufgebläht usw., aber es ist besser als nichts. Den Deheader werde ich mir auch mal anschauen. Vielen Dank
– Reinderien
6. Mai 2011 um 0:05 Uhr