2011-02-12 4 views
68

Lorsque je compile un fichier source très simple avec gcc, je n'ai pas besoin de spécifier le chemin d'accès aux fichiers d'inclusion standard tels que stdio ou stdlib.Quels sont les répertoires d'inclusion par défaut de GCC?

Comment GCC sait-il trouver ces fichiers?

Est-ce que le chemin /usr/include est câblé à l'intérieur, ou est-ce qu'il obtiendra les chemins des autres composants du système d'exploitation?

Répondre

94

Afin de comprendre les chemins par défaut utilisés aussi bien par gcc/g ++ que leurs priorités vous examinez la sortie des commandes suivantes:

  1. Pour C:

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

    gcc -xc++ -E -v - 
    

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

+0

Neat utilisation de la commande elle-même! :) – Stark07

+1

'cpp -v/dev/null -o/dev/null' –

+0

Notez que cette commande sort sur' stderr', pas sur 'stdout'. – barjak

3

Voici un article décrivant les chemins de recherche gcc: http://www.network-theory.co.uk/docs/gccintro/gccintro_21.html

En outre, vous pouvez spécifier des chemins de recherche supplémentaires avec le commutateur -I. Vous pouvez le faire à partir de la ligne de commande ou dans votre makefile.

+1

Il y a aussi pkg-config (http://pkg-config.freedesktop.org/wiki/) qui peut être utilisé (facultativement), que cet article ne mentionne pas. –

21

Il y a une commande avec une sortie plus courte, ce qui permet de couper automatiquement le comprennent pathes 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 crédit va à la libC++ front-page.

Questions connexes