web-dev-qa-db-fra.com

Où sont stockés les fichiers d'inclusion - Ubuntu Linux, GCC

Alors, quand on fait ce qui suit:

#include <stdio.h>

versus

#include "myFile.h"

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

Je pense que sur ma machine Linux Ubuntu, les fichiers sont stockés sur /usr/include/. Comment le compilateur sait-il où chercher ces fichiers? Est-ce configurable ou s'agit-il simplement de la valeur par défaut attendue? Où chercherais-je cette configuration?

Puisque je pose une question sur ces fichiers d’inclusion, quelle est leur source? 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 eu l'impression qu'ils venaient avec le compilateur, mais c'était une hypothèse ...

67
Frank V

Voir ici: chemin de recherche

Sommaire:

#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 via l'indicateur - I . Ensuite, il recherche les chemins d'inclusion standard (voir le lien ci-dessus et utilisez l'indicateur - v pour tester votre système).

#include "myFile.h"

Lorsque le fichier à inclure est entre guillemets, le préprocesseur recherche d’abord dans le répertoire en cours, puis les chemins spécifiés par - iquote , puis -I chemins, puis les chemins standard.

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

Les variables d'environnement peuvent également être utilisés pour ajouter des chemins de recherche.

Lors de la compilation, si vous utilisez le drapeau - v , vous pouvez voir les chemins de recherche utilisés.

45
Karl Voigtland

gcc est un programme "orchestrant" riche et complexe qui appelle de nombreux autres programmes pour s’acquitter de ses tâches. Dans le but précis de voir où #include "goo" et #include <zap> cherchera sur votre système, je vous 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 un moyen de voir les listes de recherche des fichiers inclus, y compris (le cas échéant) les répertoires dans lesquels #include "..." regardera mais #include <...> ne le fera pas. Cette liste spécifique que je montre est en fait sur Mac OS X (Darwin), mais les commandes que je recommande vous montreront les listes de recherche (ainsi que les détails de configuration intéressants que j'ai remplacés par ... ici ;-) sur tout système sur lequel gcc fonctionne correctement.

43
Alex Martelli

Karl a répondu à votre question sur le chemin de recherche, mais pour ce qui est de la "source des fichiers", il est important de savoir que si vous installez le paquet libfoo et que vous voulez faire du développement avec lui (c'est-à-dire , utilisez ses en-têtes), vous devrez également installer 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 comportant de nombreux en-têtes les installeront dans un sous-répertoire, par exemple, /usr/include/openssl. Pour en inclure un, il suffit de fournir le chemin sans le /usr/include partie, par exemple:

#include <openssl/aes.h>
10

Le \#include Les fichiers de gcc sont stockés dans /usr/include. Les fichiers include standard de g ++ sont stockés dans /usr/include/c++.

2
Manish Bhadani