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.
`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 voncc1
? 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 .quelle
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.
quelle
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
odercpp -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 überhauptDer CPP-Abschnitt des GCC-Handbuchs gibt an, dass sich Header-Dateien möglicherweise in den folgenden Verzeichnissen befinden:
quelle
Rufen Sie es wie folgt auf, damit GCC den gesamten Satz von Verzeichnissen ausdrucken kann, in denen nach Systemheadern gesucht wird:
Dadurch wird die Ausgabe des Formulars erstellt
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 entfernenLC_ALL=C
, die dieser Aufruf druckt, und sicherzustellen, dass dersed
Befehl funktioniert. Die Sätze "beginnt hier" und "Ende der Suchliste" werden IIRC übersetzt.)quelle
quelle
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
quelle
Sie können den (zusätzlichen) Include-Pfad für ein C-Programm von bash aus anzeigen, indem Sie Folgendes überprüfen:
Wenn dies leer ist, kann es geändert werden, um Standard-Include-Speicherorte hinzuzufügen, indem:
quelle
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.
quelle