Lorsque j'écris des programmes C sous Linux, puis les compile à l'aide de gcc, je suis toujours curieux de savoir où se trouvent ces fichiers d'en-tête. Par exemple, où stdio.h
est. Plus généralement, où est stdbool.h
?
Ce que je veux savoir, ce n'est pas seulement où il est, mais aussi comment obtenir ces endroits, par exemple, en utilisant la commande Shell ou en utilisant le langage de programmation C.
gcc -H ...
affichera le chemin complet de chaque fichier include comme effet secondaire d'une compilation régulière. Utilisation -fsyntax-only
en plus pour ne pas créer de sortie (il vous indiquera toujours si votre programme a des erreurs). Exemple (Linux, gcc-4.7):
$ cat > test.c
#include <stdbool.h>
#include <stdio.h>
^D
$ gcc -H -fsyntax-only test.c
. /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdbool.h
. /usr/include/stdio.h
.. /usr/include/features.h
... /usr/include/x86_64-linux-gnu/bits/predefs.h
... /usr/include/x86_64-linux-gnu/sys/cdefs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/gnu/stubs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/types.h
... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/bits/typesizes.h
.. /usr/include/libio.h
... /usr/include/_G_config.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h
.... /usr/include/wchar.h
... /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h
.. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h
.. /usr/include/x86_64-linux-gnu/bits/sys_errlist.h
Les points au début de chaque ligne comptent la profondeur d'imbrication du #include
est.
Si vous utilisez gcc, vous pouvez vérifier un fichier spécifique avec quelque chose comme:
echo '#include <stdbool.h>' | cpp -H -o /dev/null 2>&1 | head -n1
-H
demande au préprocesseur d'imprimer récursivement tous les fichiers inclus. head -n1
ne prend que la première ligne de sortie de cela, pour ignorer tous les fichiers inclus par l'en-tête nommé (bien que stdbool.h en particulier ne le fasse probablement pas).
Sur mon ordinateur, par exemple, les sorties ci-dessus:
. /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdbool.h
locate stdio.h
ou
mlocate stdio.h
mais locate
s'appuie sur une base de données, si vous ne l'avez jamais mise à jour
Sudo updatedb
vous pouvez également demander à gcc
de savoir quels sont les répertoires par défaut qui sont analysés par gcc
lui-même:
gcc -print-search-dirs
Pendant le prétraitement, toutes les directives du préprocesseur seront remplacées par les données réelles. Comme l'expansion des macros, la suppression des commentaires de code, y compris le code source du fichier d'en-tête, etc.
nous pouvons le vérifier en utilisant la commande "CPP" - C PreProcessor.
Par exemple, dans la ligne de commande,
cpp Filename.c
Il affichera la sortie prétraitée.
Une approche, si vous connaissez le nom du fichier include, serait d'utiliser find:
cd /
find . -name "stdio.h"
find . -name "std*.h"
Cela prendra un certain temps car il parcourt tous les répertoires.
Utilisation gcc -v
et vous pouvez vérifier le chemin d'inclusion. Habituellement, les fichiers include se trouvent dans /usr/include
ou /usr/local/include
selon l'installation de la bibliothèque.
La plupart des en-têtes standard sont stockés dans /usr/include
. Ça ressemble à stdbool.h
est stocké ailleurs et dépend du compilateur que vous utilisez. Par exemple, g ++ le stocke dans /usr/include/c++/4.7.2/tr1/stdbool.h
alors que clang le stocke dans /usr/lib/clang/3.1/include/stdbool.h
.
Je pense que le chemin générique est:
/ usr/lib/gcc/$ (ls/usr/lib/gcc /)/$ (gcc -v 2> & 1 | tail -1 | awk '{print $ 3}')/include/stdbool.h
Quand je cherchais (sur Fedora 25) j'ai utilisé "où est stdio.h" Pour moi, c'était dans /usr/include/stdio.h, /usr/share/man/man3/stdio,3.gx. Mais lorsque vous recherchez le fichier, utilisez whereis ou recherchez