Ich arbeite ein sehr großes Projekte, wo die Kompilierungszeit ist sehr lang. Welche Tools kann ich (vorzugsweise Open Source) unter Linux verwenden, um die am stärksten eingebundenen Dateien zu finden und deren Nutzung zu optimieren? Nur um klarer zu sein, brauche ich ein Werkzeug, das, abhängig von den Abhängigkeiten, mir zeigt, welche Header am meisten enthalten sind. Übrigens verwenden wir verteilte KompilierungSo finden Sie Header-Abhängigkeiten für große Projekte auf Linux
Antwort
IIRC gcc könnte Abhängigkeitsdateien erstellen.
Sie könnten verteilte Kompilierung aussehen wollen, siehe zum Beispiel distcc
Tools wie doxygen (mit den graphviz Optionen verwendet) können Abhängigkeitsgraphen für Include-Dateien erzeugen ... I don Ich weiß nicht, ob sie genügend Überblick für das bieten, was Sie versuchen, aber es könnte sich lohnen, es zu versuchen.
Dies ist nicht genau, was Sie suchen, und es ist vielleicht nicht einfach zu installieren, aber vielleicht können Sie sich lxr ansehen: lxr.linux.no ist eine browserfähige Kernel-Struktur.
Wenn Sie im Suchfeld einen Dateinamen eingeben, erhalten Sie dort, wo sie enthalten ist. Aber das ist immer noch raten, und es verfolgt keine verketteten Abhängigkeiten.
Vielleicht
strace -e trace=open -o outfile make
grep 'some handy regex to match header'
Wenn Sie möchten, welche Dateien wissen, vor allem enthalten sind, verwenden Sie diesen Befehl bash:
Fund. -name '.cpp' -exec egrep '^ [: Leerzeichen:] #include [[: Leerzeichen:]] + ["<] [[: alpha:] [: Ziffer:] _.] + ["> ] '{} \;
| sortieren | uniq -c | sortieren -k 1rn, 1
| Kopf -20
wird es Top-20-Dateien nach Höhe der Zeit waren sie eingeschlossen Platz anzuzeigen.
Erläuterung: Die erste Zeile findet alle * .cpp-Dateien und extrahiert Zeilen mit der Direktive "#include" daraus. In der zweiten Zeile wird berechnet, wie oft jede Datei enthalten war, und in der dritten Zeile werden 20 größtenteils enthaltene Dateien verwendet.
Mit der Unix-Philosophie "viele kleine Werkzeuge zusammenkleben" würde ich vorschlagen, ein kurzes Skript zu schreiben, das gcc mit den Optionen -M (oder -MM) und -MF (OUTFILE) aufruft (wie detailliert here). Dadurch werden die Abhängigkeitslisten für das make-Tool generiert, die Sie dann leicht parsen können (relativ zur direkten Analyse der Quelldateien) und die erforderlichen Informationen extrahieren.
Die Antworten here geben Ihnen Werkzeuge, die #include Abhängigkeiten verfolgen. Aber Optimierung und dergleichen werden nicht erwähnt.
Beiseite: Das Buch "Large Scale C++ Software Design" sollte helfen.
Von der Root-Ebene des Quellbaums und gehen Sie wie folgt (\ t ist die Tab-Zeichen):
find . -exec grep '[ \t]*#include[ \t][ \t]*["<][^">][">]' {} ';'
| sed 's/^[ \t]*#include[ \t][ \t]*["<]//'
| sed 's/[">].*$//'
| sort
| uniq -c
| sort -r -k1 -n
Linie 1 alle umfassen Linien zu erhalten. Zeile 2 streift alles vor dem eigentlichen Dateinamen ab. Zeile 3 streift das Ende der Zeile ab und hinterlässt nur den Dateinamen. Zeile 4 und 5 zählt jede eindeutige Zeile. Zeile 6 sortiert nach Zeilenanzahl in umgekehrter Reihenfolge.
Sie brauchen [^ ">] * anstatt [^">] im Grep. –
Diese Komponente erfasst auch keine Downstream-Komponenten. Das Parsen der Ausgabe von "gcc -E-dI" wird viel besser für ein komplexeres Projekt sein. –
Verwenden Sie ccache. Es wird die Eingaben in eine Kompilierung hashen und die Ergebnisse zwischenspeichern, was die Geschwindigkeit dieser Art von Kompilierungen drastisch erhöhen wird.
Wenn Sie wollten die mehrere enthält erkennen, so dass Sie sie entfernen konnte man makedepend als Iulian Serbanoiu schlägt verwenden:
makedepend -m *.c -f - > /dev/null
wird eine Warnung für jeweils mehrere umfassen.
Bash-Skripte auf der Seite gefunden sind keine gute Lösung. Es funktioniert nur bei einfachen Projekten. Tatsächlich werden in großen Projekten, wie in der Kopfseite beschrieben, häufig C-Präprozessor (#if, #else, ...) verwendet. Nur gute Software komplexer, wie makedepend oder scons kann gute Informationen geben. gcc -E kann helfen, aber bei großen Projekten ist die Ergebnisanalyse eine Zeitverschwendung.
- 1. Verwenden von Emacs für große große Projekte
- 2. GWT für große Projekte?
- 3. Große Projekte gebaut auf Lisp
- 4. wie man große Datei finden und auf Linux-System löschen
- 5. Wo finden Sie große Daten für Bienenstock?
- 6. So verstehen Sie bestehende Projekte
- 7. Wie planen Sie große Software-Projekte?
- 8. Emacs als IDE für große C++ Projekte
- 9. So finden Sie eindeutige Wörter aus der Datei linux
- 10. Große Projekte - Weg zum Erfolg
- 11. So finden Sie das Oracle-Ausgangsverzeichnis unter Linux
- 12. Wie finden Sie Opensource-Projekte auf der Suche nach Hilfe?
- 13. Ist Ruby on Rails gut für große Projekte?
- 14. So suchen Sie mehrere Projekte in GitLab
- 15. So konfigurieren Sie Zugriffsberechtigungen für Cassandra auf Linux Ubuntu
- 16. Open-Source-Linux-Server-Projekte
- 17. Debugging Segmentierung Fehler (Core Dumped) für große Projekte
- 18. Hier finden Sie alle abhängigen Maven Projekte
- 19. So finden Sie die Kafka-Version in Linux
- 20. So integrieren Sie Xcode Server CI für Projekte mit Cocoapods
- 21. So deaktivieren Sie die Rechtschreibprüfung für alle meine Projekte
- 22. Ist Project Lombok für große Java-Projekte geeignet?
- 23. Wie man große TYPO3 Projekte managt & entwickelt?
- 24. So finden Sie UDID für iOS9
- 25. So finden Sie Formen auf Bild
- 26. So finden Sie die Registerkarte (TabControl) auf
- 27. So finden Sie den Kontextdatensatz für Benutzermodus Ausnahme auf X64
- 28. Wie werden große Clojure-Projekte organisiert?
- 29. So vergleichen Sie Quellcode über TFS-Projekte
- 30. Verwendet jemand Maven/NAR für große C/C++ - Projekte?
Nur um klarer zu sein, brauche ich ein Werkzeug, das, abhängig von den Abhängigkeiten, mir zeigen wird, welche Header am meisten enthalten sind. Übrigens verwenden wir verteilte Kompilierung – user12371
Vielleicht sollten Sie Ihre Frage bearbeiten, um diese Informationen aufzunehmen, anstatt sie als Kommentar zu haben? – Daemin