Wo sucht gcc nach C- und C++-Header-Dateien?

Lesezeit: 4 Minuten

Benutzeravatar von Bill the Lizard
Bill die Eidechse

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

Ich habe heute Morgen ein wenig Zeit damit verbracht, nach einigen System-Header-Dateien zu suchen, also dachte ich, das wären gute Informationen, die man hier haben sollte.

  • Übrigens, wenn Sie wissen möchten, wo sich die .h-Datei befindet, siehe stackoverflow.com/a/18593344/1586797

    – Bronzemann

    22. September 2021 um 4:03 Uhr

Benutzeravatar von Drew Dormann
Zeichner Dormann

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

Dieser Befehl fragt gcc welche C++ Präprozessor, den er verwendet, und fragt dann diesen Präprozessor, wo er nach Includes sucht.

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

Ebenso für die C Präprozessor:

`gcc -print-prog-name=cpp` -v

  • Was bedeuten die `s? Ich finde es schwierig, danach zu suchen.

    – mijiturka

    23. März 2016 um 12:35 Uhr

  • @mijiturka Was bedeutet ` (Backquote/Backtick) in Bash?

    – Drew Dormann

    23. März 2016 um 18:13 Uhr


  • Ich vermute das C Präprozessor ist cpp Anstatt von cc1? Auf meinem Debian Jessie $(gcc -print-prog-name=cpp) -v (richtig) gibt einen weiteren Weg, nämlich /usr/include/x86_64-linux-gnu

    – wlnirwana

    6. Mai 2016 um 15:10 Uhr

  • Wenn Sie möchten, dass das Warten auf Eingaben nicht hängen bleibt, leiten Sie die Eingabe von um /dev/nullAlso `gcc -print-prog-name=cc1` -v < /dev/null .

    – Steve Jörgensen

    9. Oktober 2016 um 8:44 Uhr


  • @SteveJorgensen ja! Oder drücken Ctrl+Ddie im Unix-Talk “end of file” sendet.

    – Drew Dormann

    9. Oktober 2016 um 18:20 Uhr

Benutzeravatar von Robert
Robert

Außerdem sucht gcc in den Verzeichnissen, die hinter dem angegeben sind -I Möglichkeit.

  • @totaam: Überprüfen Sie Ihre Schriftart! Diese Antwort verwendet “-I” (Großbuchstabe “Auge”) und nicht “-l” (Kleinbuchstabe “ell”).

    Benutzer2423516

    14. Februar 2014 um 20:18 Uhr

  • -I steht für , während -iquote für “quotedfiles.h” steht.

    – jcomeau_ictx

    22. Juli 2014 um 8:19 Uhr

Benutzeravatar von diciu
diciu

Sie können eine Datei erstellen, die versucht, einen falschen Systemheader einzufügen. Wenn Sie gcc auf einer solchen Quelle im ausführlichen Modus ausführen, listet es alle systemintegrierten Speicherorte auf, während es nach dem falschen Header sucht.

$ 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

  • Ich denke, dies wäre hilfreicher, wenn Sie nur “verwenden Sie die Option -v” sagen würden.

    – Jay Conrod

    5. Dezember 2008 um 16:51 Uhr

  • Nun, wenn Sie “-v” ohne eine C-Datei verwenden, die einen nicht vorhandenen Systemheader enthält, werden Sie nicht veranlassen, dass gcc alle Include-Pfade durchläuft. Der Schlüssel zu meiner Antwort ist bogus.h, das als Systemheader aufgeführt ist.

    – diciu

    5. Dezember 2008 um 16:53 Uhr

  • @Jay – du hast Recht, es war zu vage – ich habe erklärt, was ich im Shell-Skript gemacht habe.

    – diciu

    5. Dezember 2008 um 16:58 Uhr

  • ohne temporäre Dateien: echo "#include <bogus.h>" | gcc -v -x c -

    – thejoshwolfe

    4. September 2012 um 22:57 Uhr


  • gcc -v -E - < /dev/null oder cpp -v < /dev/null sind genug. Sie müssen nur den Präprozessor dazu bringen Lauf, spielt es keine Rolle, welche Eingabe es sieht. (Die Suchpfade werden während des Starts ausgegeben, bevor es sich seine Eingabe überhaupt ansieht.)

    – zol

    5. April 2014 um 3:00 Uhr


Benutzeravatar von Bill the Lizard
Bill die Eidechse

Das CPP-Sektion des GCC-Handbuch gibt an, dass sich Header-Dateien in den folgenden Verzeichnissen befinden können. Von dem Suchpfad Seite:

GCC sucht an verschiedenen Stellen nach Headern. Wenn Sie es auf einem normalen Unix-System nicht anders anweisen, sucht es nach Headern, die mit #include angefordert werden in:

 /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.

Um GCC dazu zu bringen, den vollständigen Satz von Verzeichnissen auszudrucken, in denen es nach Systemheadern sucht, rufen Sie es wie folgt auf:

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

was die Ausgabe des Formulars erzeugt

#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 haben -I-family-Optionen in der Befehlszeile beeinflussen, was ausgedruckt wird.

(Das sed Befehl ist, alle loszuwerden Sonstiges Junk diese Anrufung druckt, und die LC_ALL=C ist sicherzustellen, dass die sed Befehl funktioniert – die Sätze “beginnt hier” und “Ende der Suchliste”. sind übersetzt IIRC.)

Benutzeravatar von user292283
Benutzer292283

g++ -print-search-dirs
gcc -print-search-dirs

Der Satz von Pfaden, in denen der Compiler nach den Header-Dateien sucht, kann mit dem folgenden Befehl überprüft werden:

cpp-v

Wenn Sie erklären #enthalten “” sucht der Compiler zuerst im aktuellen Verzeichnis der Quelldatei und fährt, falls nicht gefunden, mit der Suche in den oben abgerufenen Verzeichnissen fort.

Wenn Sie erklären #einschließen <> sucht der Compiler direkt in den Verzeichnissen, die er mit obigem Befehl erhält.

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

1425820cookie-checkWo sucht gcc nach C- und C++-Header-Dateien?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy