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.
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.
Antworten:
`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
cpp
anstelle von cc1
? Auf meinem Debian $(gcc -print-prog-name=cpp) -v
gibt Jessie (richtig) noch einen Pfad an, nämlich/usr/include/x86_64-linux-gnu
/dev/null
um `gcc -print-prog-name=cc1` -v < /dev/null
.
Ctrl
+ D
, um in Unix-talk "Dateiende" zu senden.
Außerdem sucht gcc in den nach der -I
Option angegebenen Verzeichnissen .
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
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
oder cpp -v < /dev/null
sind 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
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.
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 -I
Befehlszeile Optionen für -family haben, wirken sich diese auf den Ausdruck aus.
(Der sed
Befehl besteht darin, alle anderen Junk- Dateien zu entfernen LC_ALL=C
, die dieser Aufruf druckt, und sicherzustellen, dass der sed
Befehl funktioniert. Die Sätze "beginnt hier" und "Ende der Suchliste" werden IIRC übersetzt.)
g++ -print-search-dirs
gcc -print-search-dirs
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
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
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.