Wie kann man feststellen, woher eine Header-Datei stammt?

96

Wie kann ich feststellen, wo g ++ eine Include-Datei finden konnte? Grundsätzlich wenn ich

#include <foo.h>

g ++ scannt den Suchpfad und verwendet alle Include-Optionen, um den Pfad hinzuzufügen oder zu ändern. Aber gibt es am Ende der Tage eine Möglichkeit, den absoluten Pfad von foo.h zu bestimmen, den g ++ zum Kompilieren ausgewählt hat? Besonders relevant, wenn es in den unzähligen Suchpfaden mehr als ein foo.h gibt.

Kurz bevor dies erreicht werden kann ... gibt es eine Möglichkeit, g ++ dazu zu bringen, mir zu sagen, wie der endgültige Suchpfad nach dem Einbeziehen von Standardeinstellungen und allen Include-Optionen lautet?

harschware
quelle
1
Verwandte Themen: Gibt es eine Möglichkeit, festzustellen, aus welchen übergeordneten Include-Dateien eine untergeordnete Include-Datei aufgenommen wurde? Dh um das eingeschlossene-von-Diagramm zu zeigen (Hinweis: gcc-E ist nicht ganz da ... könnte verarbeitet werden, um es zu ergeben.)
Krazy Glew

Antworten:

77

Dies gibt make-Abhängigkeiten, in denen die absoluten Pfade der Include-Dateien aufgelistet sind:

gcc  -M showtime.c

Wenn Sie nicht möchten, dass das System enthält (dh #include <something.h>), verwenden Sie:

gcc  -MM showtime.c
Sodved
quelle
18
Es ist zu beachten, dass bei Verwendung in Verbindung mit "-o myObj.o" die Ausgabe und nicht die kompilierte Binärdatei in "myObj.o" verschoben wird. -M hat ein implizites -E, sodass die Kompilierung nicht durchgeführt wird. Ich fand, dass -MD stattdessen eine sehr nützliche Option ist. Es führt die Kompilierung durch und legt die Ausgabe stattdessen in myObj.d ab. Wenn Sie einen geeigneten Parameter für das Voranstellen an Ihre Kompilierungszeile ohne seltsame Effekte wie * .o festlegen, wird jetzt die Ausgabe anstelle der Binärdatei angezeigt. Danke für Ihre Hilfe.
Harschware
Alle zugehörigen gcc-Optionen werden hier beschrieben .
Akhan
105
g++ -H ...

druckt auch den vollständigen Pfad der Include-Dateien in einem Format, das anzeigt, welcher Header welche enthält

Kugelmagnet
quelle
7
Dies scheint meiner Erfahrung nach hilfreicher zu sein als -M. Ich mag die hierarchische Darstellung dessen, was was beinhaltet.
Brian Minton
Gut, es ist hilfreich für Debug-Zwecke.
1
Dies ist die beste Antwort. Sie können es Ihrem Erstellungsprozess hinzufügen, ohne etwas anderes zu ändern.
Timmmm
4
Dies beantwortet die Frage wirklich mehr als die akzeptierte Antwort. Das einzige unglückliche Problem ist, dass ich Clang nicht davon abhalten konnte, die Datei normal zu kompilieren, also habe ich letztendlich verwendet clang++ -MM -H(was eine etwas nützliche Kombination ist).
Rookie1024
@ rookie1024 Verwenden clang++ -H -fsyntax-only ...Sie diese Option, wenn Sie das Generieren von Ausgabedateien vermeiden möchten (funktioniert auch für gcc).
Lekensteyn
8

Sicher verwenden

g++ -E -dI  ... (whatever the original command arguments were)
Wallyk
quelle
2
Diese Lösung bietet mehrere Vorteile: 1. Sie können mehrere Einschlüsse einer einzelnen Header-Datei erkennen (-H und -M drucken jede enthaltene Datei nur einmal). 2. Sie können sehen, wo sie enthalten ist (Name und Zeilennummer des Originals Anweisung einschließen). 3. Dadurch können Sie zuverlässig (!) Unterscheiden, ob ein Header direkt oder indirekt oder beides enthalten ist (dies ist wichtig für Aufräumarbeiten.)
Hagello
5

Wenn Sie -MModer eine der zugehörigen Optionen ( -Musw.) verwenden, erhalten Sie nur die Liste der enthaltenen Header, ohne alle anderen Präprozessorausgaben (die Sie mit der vorgeschlagenen g++ -E -dILösung zu erhalten scheinen ).

Jonathan Leffler
quelle
g++ -MM t.cczeigt überhaupt keine Inklusion, nur t.o: t.cc. Braucht es noch etwas?
Wallyk
3
Schön - der Vollständigkeit halber können Sie mit MSVC ähnliche Optionen verwenden /showIncludes. MSVC wird sogar einrücken, um Ihnen die Verschachtelung von Headern zu zeigen (das sehe ich bei -MGCC nicht).
Michael Burr