82 votes

Où sont stockés les fichiers include - Ubuntu Linux, GCC

Donc, quand on fait ce qui suit :

#include <stdio.h>

contre

#include "myFile.h"

le compilateur, GCC dans mon cas, sait où se trouve le fichier stdio.h (et même le fichier objet) sur mon disque dur. Il utilise simplement les fichiers sans aucune interaction de ma part.

I pensez à que sur ma machine Ubuntu Linux les fichiers sont stockés à /usr/include/ . Comment le compilateur sait-il où chercher ces fichiers ? Est-ce que c'est configurable ou est-ce que c'est juste le défaut attendu ? Où puis-je trouver cette configuration ?

Puisque je pose une question sur ces fichiers inclus, quelle est la source de ces fichiers ? Je sais que cela peut être flou dans la communauté Linux mais qui les gère ? Qui fournirait et gérerait les mêmes fichiers pour un compilateur Windows.

J'ai toujours eu l'impression qu'ils venez avec le compilateur mais c'était une supposition...

54voto

Karl Voigtland Points 5111

Voir ici : Chemin de recherche

Résumé :

#include <stdio.h>

Lorsque le fichier d'inclusion est entre parenthèses, le préprocesseur effectue d'abord une recherche dans les chemins spécifiés par la directive -I drapeau. Ensuite, il cherche dans les chemins d'inclusion standard (voir le lien ci-dessus, et utiliser l'attribut -v pour le tester sur votre système).

#include "myFile.h"

Lorsque le fichier d'inclusion est entre guillemets, le préprocesseur cherche d'abord dans le répertoire courant, puis dans les chemins spécifiés par -iquote alors -I les chemins, puis les chemins standard.

-nostdinc peut être utilisé pour empêcher le préprocesseur de rechercher les chemins standards.

Variables d'environnement peut également être utilisé pour ajouter des chemins de recherche.

Lors de la compilation, si vous utilisez l'option -v vous pouvez voir les chemins de recherche utilisés.

45voto

Alex Martelli Points 330805

Gcc est un programme "orchestrant" riche et complexe qui appelle de nombreux autres programmes pour effectuer ses tâches. Dans le but spécifique de voir où #include "goo" y #include <zap> va chercher sur votre système, je vous le recommande :

$ touch a.c
$ gcc -v -E a.c
 ...
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
# 1 "a.c"

C'est une façon de voir les listes de recherche pour les fichiers inclus, y compris (s'il y en a) les répertoires dans lesquels #include "..." regardera mais #include <...> ne le feront pas. Cette liste spécifique que je montre est en fait sur Mac OS X (aka Darwin) mais les commandes que je recommande vous montreront les listes de recherche (ainsi que des détails de configuration intéressants que j'ai remplacé par ... ici;-) sur tout système sur lequel gcc fonctionne correctement.

4 votes

Pouvez-vous expliquer d'où GCC sait qu'il doit chercher dans /Library/Frameworks dans l'exemple que vous avez fourni ? Disons qu'il est codé en dur pour chercher dans /usr/include et /usr/local/include mais d'où viennent les répertoires supplémentaires ? De l'environnement ?

10voto

Karl a répondu à votre question sur le chemin de recherche, mais pour ce qui est de la "source des fichiers", il faut savoir que si vous installez l'application libfoo et que vous souhaitez développer avec lui (c'est-à-dire utiliser ses en-têtes), vous devrez également installer le paquet libfoo-dev . Les fichiers d'en-tête de la bibliothèque standard sont déjà dans /usr/include comme vous l'avez vu.

Notez que certaines bibliothèques avec beaucoup d'en-têtes les installeront dans un sous-répertoire, par exemple, /usr/include/openssl . Pour inclure l'un d'entre eux, il suffit de fournir le chemin d'accès sans la balise /usr/include partie, par exemple :

#include <openssl/aes.h>

4voto

Manish Bhadani Points 397

El \#include de gcc sont stockés dans /usr/include . Les fichiers d'inclusion standard de g++ sont stockés dans le répertoire /usr/include/c++ .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X