Was sind die Standard-GCC-Include-Verzeichnisse?

131

Wenn ich eine sehr einfache Quelldatei mit gcc kompiliere, muss ich nicht den Pfad zu Standard-Include-Dateien wie stdio oder stdlib angeben.

Woher weiß GCC, wie man diese Dateien findet?

Ist der /usr/includePfad fest verdrahtet, oder werden die Pfade von anderen Betriebssystemkomponenten abgerufen?

Raxvan
quelle

Antworten:

188

Um die von gcc/ verwendeten Standardpfade g++sowie deren Prioritäten zu ermitteln, müssen Sie die Ausgabe der folgenden Befehle untersuchen:

  1. Für C :
    gcc -xc -E -v -
  1. Für C ++ :
    gcc -xc++ -E -v -

Der Kredit geht an das Qt Creator-Team .

Ihor Kaharlichenko
quelle
5
cpp -v /dev/null -o /dev/null
Nehal J Wani
36

Es gibt einen Befehl mit einer kürzeren Ausgabe, mit dem die Include-Pfade automatisch aus Zeilen ausgeschnitten werden können, beginnend mit einem einzelnen Leerzeichen:

$ echo | gcc -Wp,-v -x c++ - -fsyntax-only
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/backward
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include
 /usr/local/include
 /usr/include
End of search list.

Das Guthaben geht an die libc ++ - Startseite .

Abgrund.7
quelle
1

Obwohl ich der Antwort von Ihor Kaharlichenko für die Berücksichtigung von C ++ und der Antwort von abyss.7 für die Kompaktheit der Ausgabe zustimme, sind sie für die Multi-Arch-Versionen von gcc immer noch unvollständig, da die Eingabeverarbeitung von den Befehlszeilenparametern und Makros abhängt.

Beispiel:

echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -specs=nano.specs -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=soft -x c++ -E -Wp,-v\ - -fsyntax-only ergibt


/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../arm-none-eabi/include/newlib-nano                                                                                                              
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi/thumb/v7e-m/nofp                                         
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
 /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  

während echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-onlyergibt


/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi                                                          
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  

Der erstere Aufruf verwendet newlib(siehe Zeilen 1 und 3 der Ausgabe), der letztere gehört zu den Standard-Includes. Die allgemeinen Dateien am Ende der Liste sind ein Beispiel für die Verwendung von include_next.

Fazit: Berücksichtigen Sie beim Drucken der Include-Verzeichnisse immer alle Makros und Compiler-Optionen .

hermannk
quelle
1

Führen Sie einfach Folgendes aus, um die Standardsuchpfade aufzulisten:

$(gcc -print-prog-name=cc1) -v
Daniele Testa
quelle
Die Include-Pfade werden nicht aufgelistet. Nur Programme Pfad und Bibliotheken Pfad
Kayahr
cc1kann normalerweise nicht direkt aufgerufen werden, da es sich um einen internen Befehl handelt, der sich nicht im PATH befindet. Vielleicht möchten Sie Ihre Antwort bearbeiten, um zu beschreiben, wo sich die Datei befindet.
Kayahr