Wo sucht gcc nach C- und C ++ - Headerdateien?

185

Wo sucht gcc auf einem Unix-System nach Header-Dateien?

Ich habe heute Morgen ein wenig Zeit damit verbracht, nach System-Header-Dateien zu suchen, daher dachte ich, dies wären gute Informationen, die ich hier haben könnte.

Bill die Eidechse
quelle

Antworten:

227
`gcc -print-prog-name=cc1plus` -v

Dieser Befehl fragt gcc, welchen C ++ - Präprozessor er verwendet, und fragt dann den Präprozessor, nach dem er sucht.

Sie erhalten eine zuverlässige Antwort für Ihr spezifisches Setup.

Ebenso für den C- Präprozessor:

`gcc -print-prog-name=cpp` -v
Drew Dormann
quelle
2
Was bedeuten die? Ich finde es schwierig, danach zu suchen.
Mijiturka
5
Ich denke, der C- Präprozessor ist cppanstelle von cc1? Auf meinem Debian $(gcc -print-prog-name=cpp) -vgibt Jessie (richtig) noch einen Pfad an, nämlich/usr/include/x86_64-linux-gnu
wlnirvana
3
Wenn Sie möchten, dass das nicht auf die Eingabe wartet, leiten Sie die Eingabe von /dev/nullum `gcc -print-prog-name=cc1` -v < /dev/null.
Steve Jorgensen
@SteveJorgensen yep! Oder drücken Sie Ctrl+ D, um in Unix-talk "Dateiende" zu senden.
Drew Dormann
40

Außerdem sucht gcc in den nach der -IOption angegebenen Verzeichnissen .


Robert
quelle
4
@totaam: Überprüfen Sie Ihre Schriftart! Diese Antwort verwendet "-I" (Großbuchstabe "Auge") und nicht "-l" (Kleinbuchstabe "Ell").
3
-Ich bin für <anglebracketed.h>, während -iquote für "quotefiles.h" ist
jcomeau_ictx
28

Sie können eine Datei erstellen, die versucht, einen gefälschten Systemheader einzuschließen. Wenn Sie gcc im ausführlichen Modus für eine solche Quelle ausführen, werden alle Speicherorte des Systems aufgelistet, während nach dem falschen Header gesucht wird.

$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c

[..]

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

[..]

t.c:1:32: error: bogus.h: No such file or directory
diciu
quelle
3
Ich denke, dies wäre hilfreicher, wenn Sie nur "Verwenden Sie die Option -v" sagen würden.
Jay Conrod
Wenn Sie "-v" ohne eine C-Datei verwenden, die einen nicht vorhandenen Systemheader enthält, wird gcc nicht alle Include-Pfade durchlaufen. Der Schlüssel zu meiner Antwort ist bogus.h, der als Systemheader aufgeführt ist.
Diciu
@ Jay - du hast recht, es war zu vage - ich habe erklärt, was ich im Shell-Skript gemacht habe.
Diciu
9
ohne temporäre Dateien:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe
2
gcc -v -E - < /dev/nulloder cpp -v < /dev/nullsind genug. Sie müssen nur den Präprozessor zum Laufen bringen , es spielt keine Rolle, welche Eingabe er sieht. (Die Suchpfade werden während des Startvorgangs gedruckt, bevor die Eingabe überhaupt
angezeigt wird
17

Der CPP-Abschnitt des GCC-Handbuchs gibt an, dass sich Header-Dateien möglicherweise in den folgenden Verzeichnissen befinden:

GCC sucht an verschiedenen Stellen nach Headern. Wenn Sie auf einem normalen Unix-System keine anderen Anweisungen geben, sucht es nach Headern, die mit #include in angefordert wurden:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

Bei C ++ - Programmen wird zuerst auch in / usr / include / g ++ - v3 gesucht.

Bill die Eidechse
quelle
Das ist in Ordnung für Ihre aktuelle Version von gcc. Die tatsächlichen Verzeichnisse, in denen es angezeigt wird, hängen von den Optionen ab, die beim Erstellen von gcc angegeben wurden. Eine bessere Lösung finden Sie unter Shmoopty-Antwort.
Martin York
PS: Meine C ++ - Headerdateien befinden sich in: /usr/include/c++/4.0.0
Martin York
3
@ Martin: Du bist alte Schule. Meine sind in /usr/include/c++/4.2 :)
Bill the Lizard
10

Rufen Sie es wie folgt auf, damit GCC den gesamten Satz von Verzeichnissen ausdrucken kann, in denen nach Systemheadern gesucht wird:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

Dadurch wird die Ausgabe des Formulars erstellt

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

Wenn Sie in der -IBefehlszeile Optionen für -family haben, wirken sich diese auf den Ausdruck aus.

(Der sedBefehl besteht darin, alle anderen Junk- Dateien zu entfernen LC_ALL=C, die dieser Aufruf druckt, und sicherzustellen, dass der sedBefehl funktioniert. Die Sätze "beginnt hier" und "Ende der Suchliste" werden IIRC übersetzt.)

zwol
quelle
9
g++ -print-search-dirs
gcc -print-search-dirs
user292283
quelle
3
Diese Befehle drucken die Standardsuchpfade für Linkbibliotheken und interne Komponenten des Compilers. Sie erzählen nichts über Header-Dateien.
zwol
6

Die Pfade, in denen der Compiler nach den Header-Dateien sucht, können mit dem folgenden Befehl überprüft werden:

cpp -v

Wenn Sie #include "" deklarieren , sucht der Compiler zuerst im aktuellen Verzeichnis der Quelldatei und setzt die Suche in den oben abgerufenen Verzeichnissen fort, wenn sie nicht gefunden wird.

Wenn Sie #include <> deklarieren , sucht der Compiler direkt in den Verzeichnissen, die mit dem obigen Befehl abgerufen wurden.

Quelle: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026

Suhas Chikkanna
quelle
1

Sie können den (zusätzlichen) Include-Pfad für ein C-Programm von bash aus anzeigen, indem Sie Folgendes überprüfen:

echo $C_INCLUDE_PATH

Wenn dies leer ist, kann es geändert werden, um Standard-Include-Speicherorte hinzuzufügen, indem:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
user2844647
quelle
1

Dies sind die Verzeichnisse, in denen gcc standardmäßig nach den angegebenen Header-Dateien sucht (vorausgesetzt, die Header-Dateien sind in Chevrons <> enthalten). 1. / usr / local / include / - wird für Header-Dateien von Drittanbietern verwendet. 2. / usr / include / - wird für Systemheaderdateien verwendet.

Wenn Sie Ihre benutzerdefinierte Header-Datei an einem anderen Ort als den oben genannten Verzeichnissen ablegen möchten, können Sie sie wie folgt einschließen: 1. Verwenden Sie Anführungszeichen ("./custom_header_files/foo.h") mit Dateipfad anstelle von Chevrons in der include-Anweisung. 2. Verwenden Sie beim Kompilieren des Codes den Schalter -I. gcc -I / home / user / custom_headers / -c foo.c -p foo.o Grundsätzlich weist der Schalter -I den Compiler an, zuerst in das mit dem Schalter -I angegebene Verzeichnis zu schauen (bevor er die Standardverzeichnisse überprüft) Mit dem Schalter -I können die Header-Dateien mithilfe von Chevrons eingefügt werden.

akhil tiwari
quelle