Quels sont les répertoires d'inclusion par défaut de GCC?

131

Lorsque je compile un fichier source très simple avec gcc, je n'ai pas à spécifier le chemin d'accès aux fichiers d'inclusion standard tels que stdio ou stdlib.

Comment GCC sait-il comment trouver ces fichiers?

Le /usr/includechemin est-il câblé à l'intérieur, ou il obtiendra les chemins d'autres composants du système d'exploitation?

Raxvan
la source

Réponses:

188

Afin de déterminer les chemins par défaut utilisés par gcc/ g++, ainsi que leurs priorités, vous devez examiner la sortie des commandes suivantes:

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

Le mérite revient à l' équipe Qt Creator .

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

Il existe une commande avec une sortie plus courte, qui permet de couper automatiquement les chemins d'inclusion des lignes, en commençant par un seul espace:

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

Le mérite revient à la page d'accueil de libc ++ .

abîme.7
la source
1

Bien que je sois d'accord avec la réponse d'Ihor Kaharlichenko pour considérer C ++ et avec la réponse d'abyss.7 pour la compacité de sa sortie, elles sont encore incomplètes pour les versions multi-arch de gcc car le traitement des entrées dépend des paramètres de ligne de commande et des macros.

Exemple:

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 rendements


/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                                                                                  

alors que echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-onlydonne


/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                                                                                  

La première invocation utilise newlib(voir les lignes 1 et 3 de la sortie), la seconde va avec la norme inclut. Les fichiers communs à la fin de la liste sont un exemple d'utilisation de include_next.

Bottom line: Tenez toujours compte de toutes les macros et options du compilateur lors de l'impression des répertoires include.

Hermannk
la source
1

Exécutez simplement ce qui suit pour répertorier les chemins de recherche par défaut:

$(gcc -print-prog-name=cc1) -v
Daniele Testa
la source
Cela ne répertorie pas les chemins d'inclusion. Seul le chemin des programmes et le chemin des bibliothèques
kayahr
cc1ne peut généralement pas être appelé directement car il s'agit d'une commande interne qui n'est pas sur le PATH. Peut-être souhaitez-vous modifier votre réponse pour décrire où trouver le fichier.
kayahr