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?

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 .


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


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.


1

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.