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.
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.
Réponses:
`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 de cc1
? 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.
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.
$ echo "#include <bogus.h>" > 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
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
ou cpp -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:
GCC recherche les en-têtes à plusieurs endroits différents. Sur un système Unix normal, si vous ne lui demandez pas le contraire, 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 cherchera également dans / usr / include / g ++ - v3, en premier.
Pour que GCC affiche l'ensemble complet des répertoires où il recherchera les en-têtes système, appelez-le comme ceci:
$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 |
LC_ALL=C sed -ne '/starts here/,/End of/p'
qui produira la sortie du formulaire
#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
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, et LC_ALL=C
à s'assurer que la sed
commande fonctionne - les expressions «commence ici» et «Fin de la liste de recherche» sont traduites par IIRC.)
g++ -print-search-dirs
gcc -print-search-dirs
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
On pourrait afficher le chemin d'inclusion (supplémentaire) pour un programme C à partir de bash en vérifiant ce qui suit:
echo $C_INCLUDE_PATH
Si ce champ est vide, il peut être modifié pour ajouter des emplacements d'inclusion par défaut, en:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
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.