Sur un système Unix, où gcc recherche-t-il les fichiers d'en-tête?
J'ai passé un peu de temps ce matin à chercher des fichiers d'en-tête système, alors j'ai pensé que ce serait une bonne information à avoir ici.
`gcc -print-prog-name=cc1plus` -v
Cette commande demande à gcc quel préprocesseur C ++ il utilise, puis demande à ce préprocesseur où il recherche les inclusions.
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
cpp
au lieu decc1
? Sur mon debian jessie$(gcc -print-prog-name=cpp) -v
(correctement) donne un autre chemin, qui est/usr/include/x86_64-linux-gnu
/dev/null
, donc`gcc -print-prog-name=cc1` -v < /dev/null
.Ctrl
+D
, qui envoie "fin de fichier" dans Unix-talk.De plus, gcc cherchera dans les répertoires spécifiés après l'
-I
option.la source
Vous pouvez créer un fichier qui tente d'inclure un faux en-tête système. Si vous exécutez gcc en mode détaillé sur une telle source, il listera tous les emplacements d'inclusion du système pendant qu'il recherche l'en-tête faux.
la source
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
oucpp -v < /dev/null
suffisent. Il vous suffit d'obtenir le préprocesseur courir , il n'a pas d' importance ce que l' entrée qu'il voit. (Les chemins de recherche sont imprimés au démarrage, avant même qu'il ne regarde son entrée.)La section CPP du manuel GCC indique que les fichiers d'en-tête peuvent être situés dans les répertoires suivants:
la source
Pour que GCC affiche l'ensemble complet des répertoires où il recherchera les en-têtes système, appelez-le comme ceci:
qui produira la sortie du formulaire
Si tu as
-I
options -family sur la ligne de commande, elles affecteront ce qui est imprimé.(La
sed
commande consiste à se débarrasser de tous les autres fichiers indésirables que cette invocation imprime, etLC_ALL=C
à s'assurer que lased
commande fonctionne - les expressions «commence ici» et «Fin de la liste de recherche» sont traduites par IIRC.)la source
la source
L'ensemble des chemins où le compilateur recherche les fichiers d'en-tête peut être vérifié par la commande: -
cpp -v
Si vous déclarez #include "" , le compilateur recherche d'abord dans le répertoire courant du fichier source et s'il n'est pas trouvé, continue de chercher dans les répertoires récupérés ci-dessus.
Si vous déclarez #include <> , le compilateur recherche directement dans les répertoires obtenus à partir de la commande ci-dessus.
Source: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
la source
On pourrait afficher le chemin d'inclusion (supplémentaire) pour un programme C à partir de bash en vérifiant ce qui suit:
Si ce champ est vide, il peut être modifié pour ajouter des emplacements d'inclusion par défaut, en:
la source
Ce sont les répertoires dans lesquels gcc recherche par défaut les fichiers d'en-tête spécifiés (étant donné que les fichiers d'en-tête sont inclus dans les 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 système.
Si vous décidez de placer votre fichier d'en-tête personnalisé dans un endroit 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 des chevrons dans l'instruction include. 2. en utilisant le commutateur -I lors de la compilation du code. gcc -I / home / user / en-têtes_personnalisés / -c foo.c -p foo.o Fondamentalement, le commutateur -I indique au compilateur de regarder d'abord dans le répertoire spécifié avec 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.
la source