web-dev-qa-db-fra.com

Où gcc cherche-t-il les fichiers d'en-tête C et C ++?

Sur un système Unix, où gcc cherche-t-il les fichiers d’en-tête?

J'ai passé un peu de temps ce matin à la recherche de fichiers d'en-tête de système. J'ai donc pensé que ce serait une bonne information à avoir ici.

168
Bill the Lizard
`gcc -print-prog-name=cc1plus` -v

Cette commande demande à gcc quel préprocesseur C++ il utilise, puis demande au préprocesseur où il recherche les inclus.

Vous obtiendrez une réponse fiable pour votre configuration spécifique.

De même, pour le préprocesseur C :

`gcc -print-prog-name=cpp` -v
206
Drew Dormann

De plus, gcc cherchera dans les répertoires spécifiés après le -I option.


35
robert

Vous pouvez créer un fichier qui tente d'inclure un en-tête système faux. Si vous exécutez gcc en mode commenté sur une telle source, il répertorie tous les emplacements d'inclusion système, car il recherche l'en-tête fictif.

$ echo "#include <bogus.h> int main(){}" > t.c; gcc -v t.c; rm t.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.

[..]

t.c:1:32: error: bogus.h: No such file or directory
24
diciu

Le Section CPP du Manuel GCC indique que les fichiers d'en-tête peuvent être situés dans les répertoires suivants:

GCC cherche des en-têtes dans plusieurs endroits différents. Sur un système Unix normal, si vous ne donnez pas d'autres instructions, il recherchera les en-têtes demandés avec #include dans:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

Pour les programmes C++, il s’agira d’abord de/usr/include/g ++ - v3.

17
Bill the Lizard
g++ -print-search-dirs
gcc -print-search-dirs
8
user292283

Pour que GCC imprime l’ensemble complet des répertoires dans lesquels il recherchera les en-têtes système, appelez-le comme suit:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

qui produira une sortie de la forme

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

Si tu as -I- Les options de famille sur la ligne de commande affecteront ce qui est imprimé.

(La commande sed consiste à supprimer toutes les autres ordures générées par cette invocation, et la LC_ALL=C est de s’assurer que la commande sed fonctionne - les expressions "commence ici" et "Fin de la liste de recherche" are IIRC.)

8
zwol

L'ensemble des chemins où le compilateur recherche les fichiers d'en-tête peut être vérifié à l'aide de la commande: -

cpp -v

Si vous déclarez # include "", le compilateur commence par rechercher dans le répertoire en cours du fichier source. S'il n'est pas trouvé, continue à rechercher dans les répertoires récupérés ci-dessus.

Si vous déclarez # include <>, le compilateur effectue une recherche directement dans les répertoires obtenus à l'aide de la commande ci-dessus.

Source: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026

4
Suhas Chikkanna

On pourrait voir le chemin d’inclusion (supplémentaire) pour un programme C de bash en vérifiant ce qui suit:

echo $C_INCLUDE_PATH

S'il est vide, vous pouvez le modifier pour ajouter des emplacements d'inclusion par défaut, comme suit:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
1
user2844647

Ce sont les répertoires que gcc recherche par défaut pour les fichiers d’en-tête spécifiés (étant donné que les fichiers d’en-tête sont inclus dans chevrons <>); 1./usr/local/include/--utilisé pour les fichiers d’en-tête tiers. 2./usr/include/- utilisé pour les fichiers d’en-tête du système.

Si vous décidez de placer votre fichier d'en-tête personnalisé à un emplacement autre que les répertoires mentionnés ci-dessus, vous pouvez les inclure comme suit: 1. en utilisant des guillemets ("./custom_header_files/foo.h") avec le chemin des fichiers, au lieu de chevrons dans la déclaration d'inclusion. 2. en utilisant le commutateur -I lors de la compilation du code. gcc -I/home/utilisateur/custom_headers/-c toto.c -p toto.o En gros, le commutateur -I demande au compilateur de rechercher d'abord dans le répertoire spécifié par le commutateur -I (avant de vérifier les répertoires standard). en utilisant le commutateur -I, les fichiers d'en-tête peuvent être inclus en utilisant des chevrons.

0
akhil tiwari