Quali sono le directory include predefinite di GCC?


131

Quando compilo un file sorgente molto semplice con gcc, non devo specificare il percorso per includere file standard come stdio o stdlib.

Come fa GCC a trovare questi file?

Ha il /usr/includepercorso cablato all'interno o otterrà i percorsi da altri componenti del sistema operativo?

Risposte:


188

Per capire i percorsi predefiniti utilizzati da gcc/ g++, nonché le loro priorità, è necessario esaminare l'output dei seguenti comandi:

  1. Per C :
    gcc -xc -E -v -
  1. Per C ++ :
    gcc -xc++ -E -v -

Il merito va al team di Qt Creator .


5
cpp -v /dev/null -o /dev/null
Nehal J Wani,

36

Esiste un comando con un output più breve, che consente di tagliare automaticamente i percorsi di inclusione dalle linee, iniziando con un singolo spazio:

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

Il merito va alla prima pagina di libc ++ .


1

Sebbene io sia d'accordo con la risposta di Ihor Kaharlichenko per aver considerato C ++ e con la risposta di abyss.7 per la compattezza del suo output, sono ancora incompleti per le versioni multi-arch di gcc perché l'elaborazione dell'input dipende dai parametri e macro della riga di comando.

Esempio:

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 i rendimenti


/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                                                                                  

mentre i echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-onlyrendimenti


/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                                                                                  

Il primo invocazione utilizza newlib(vedere le righe 1 e 3 dell'output), il secondo si riferisce alle inclusioni standard. I file comuni alla fine dell'elenco sono un esempio dell'uso di include_next.

Conclusione: considerare sempre tutte le macro e le opzioni del compilatore quando si stampano le directory include.


1

Basta eseguire quanto segue per elencare i percorsi di ricerca predefiniti:

$(gcc -print-prog-name=cc1) -v

Questo non elenca i percorsi di inclusione. Solo percorso dei programmi e percorso delle librerie
kayahr,

cc1di solito non può essere chiamato direttamente perché è un comando interno che non si trova sul PERCORSO. Forse vuoi modificare la tua risposta per descrivere dove trovare il file.
kayahr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.