Où sont stockés les fichiers include-Ubuntu Linux, GCC
Donc, quand nous faisons ce qui suit:
#include <stdio.h>
Contre
#include "myFile.h"
Le compilateur, GCC dans mon cas, sait où ce stdio.h (et même le fichier objet) sont situés sur mon disque dur. Il utilise simplement les fichiers sans interaction de ma part.
Je pense {[11] } que sur ma machine Linux Ubuntu les fichiers sont stockés à /usr/include/
. comment le compilateur sait - il où chercher ces fichiers? est-ce configurable ou est-ce juste la valeur par défaut attendue? Où pourrais-je regarder pour cette configuration?
puisque je pose une question sur ces fichiers include, Quelle est la source des fichiers? Je sais que cela pourrait ê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 été sous l'impression qu'ils venez avec le compilateur, mais c'était une hypothèse...
4 réponses
Voir ici: Chemin de Recherche de
Résumé:
#include <stdio.h>
Lorsque le fichier include est entre parenthèses, le préprocesseur recherche d'abord dans les chemins spécifiés via l'indicateur -I. Ensuite, il recherche les chemins d'inclusion standard (voir le lien ci-dessus, et utilisez l'indicateur - V pour tester sur votre système).
#include "myFile.h"
Lorsque le fichier à inclure est devis le préprocesseur recherche d'abord dans le répertoire courant, puis les chemins spécifiés par -iquote, puis -I chemins, la norme chemins.
-nostdinc peut être utilisé pour empêcher le préprocesseur de rechercher les chemins standard.
Les variables d'Environnement peut également être utilisé pour ajouter des chemins de recherche.
Lors de la compilation si vous utilisez v drapeau, vous pouvez voir les chemins de recherche utilisé.
Gcc est un programme "orchestrant" riche et complexe qui fait appel à de nombreux autres programmes pour remplir ses fonctions. Dans le but spécifique de voir où #include "goo"
et #include <zap>
vont rechercher sur votre système, je 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 (le cas échéant) les répertoires dans lesquels #include "..."
regardera mais #include <...>
ne sera pas. cette liste spécifique que je montre est en fait sur Mac OS X (aka Darwin) mais les commandes que je recommande vous montrera les listes de recherche (ainsi comme détails de configuration intéressants que j'ai remplacés par ...
ici; -) sur n'importe quel système sur lequel gcc fonctionne correctement.
Karl a répondu à votre question search-path, mais en ce qui concerne la "source des fichiers", une chose à savoir est que si vous installez le paquet libfoo
et que vous voulez faire du développement avec lui (c'est-à-dire utiliser ses en-têtes), vous devrez également installer libfoo-dev
. Les fichiers d'en-tête de 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 de les installer dans un sous-répertoire, par exemple, /usr/include/openssl
. Pour inclure l'un de ceux-ci, il suffit de fournir le chemin sans le /usr/include
partie, par exemple:
#include <openssl/aes.h>
Le \#include
fichiers de gcc sont stockés dans /usr/include
.
Les fichiers include standard de g++ sont stockés dans /usr/include/c++
.