web-dev-qa-db-fra.com

Comment puis-je trouver les fichiers d'en-tête du langage de programmation C sous Linux?

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.

50
Yishu Fang

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.

61
zwol

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
26
aschepler
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
22
guz

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.

4
Sankar Mani

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.

2
Marvo

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.

1

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.

1
Xymostech

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

1
Josmar

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

0
Jordan