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.
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.
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
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/null
Also `gcc -print-prog-name=cc1` -v < /dev/null
.
– Steve Jörgensen
9. Oktober 2016 um 8:44 Uhr
@SteveJorgensen ja! Oder drücken Ctrl
+D
die im Unix-Talk “end of file” sendet.
– Drew Dormann
9. Oktober 2016 um 18:20 Uhr
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
– jcomeau_ictx
22. Juli 2014 um 8:19 Uhr
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
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.)
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
Ü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