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.
`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
De plus, gcc cherchera dans les répertoires spécifiés après le -I
option.
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
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.
g++ -print-search-dirs
gcc -print-search-dirs
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.)
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
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
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.