
Colmillo Yishu
Cuando escribo programas C en Linux y luego los compilo usando gcc, siempre tengo curiosidad por saber dónde están esos archivos de encabezado. Por ejemplo, donde stdio.h
es. Más generalmente, ¿dónde está stdbool.h
?
Lo que quiero saber no es solo dónde está, sino también cómo llegar a esos lugares, por ejemplo, usando el comando de shell o usando el lenguaje de programación C.

zwol
gcc -H ...
imprimirá la ruta completa de cada archivo de inclusión como un efecto secundario de la compilación regular. Utilizar -fsyntax-only
además de conseguir que no cree ninguna salida (aún así te dirá si tu programa tiene errores). Ejemplo (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
Los puntos al comienzo de cada línea cuentan cuán profundamente anidado está el #include
es.
Si usa gcc, puede verificar un archivo específico con algo como:
echo '#include <stdbool.h>' | cpp -H -o /dev/null 2>&1 | head -n1
-H
pide al preprocesador que imprima todos los archivos incluidos recursivamente. head -n1
toma solo la primera línea de salida de eso, para ignorar cualquier archivo incluido por el encabezado nombrado (aunque stdbool.h en particular probablemente no lo haga).
En mi computadora, por ejemplo, los resultados anteriores:
. /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdbool.h

guz
locate stdio.h
o
mlocate stdio.h
pero locate
se basa en una base de datos, si nunca la ha actualizado
sudo updatedb
también puedes consultar gcc
para saber cuáles son los directorios predeterminados que son escaneados por gcc
sí mismo:
gcc -print-search-dirs

sankar mani
Durante el preprocesamiento, todas las directivas del preprocesador se reemplazarán con las actuales. Como la expansión de macros, la eliminación de comentarios de código, incluido el código fuente del archivo de encabezado, etc.
podemos comprobarlo usando el cpp
– Comando C Preprocesador.
Por ejemplo en la línea de comando:
cpp Filename.c
muestra la salida preprocesada.
Un enfoque, si conoce el nombre del archivo de inclusión, sería usar find:
cd /
find . -name "stdio.h"
find . -name "std*.h"
Eso llevará un tiempo, ya que pasa por todos los directorios.

Verano_Más_Más_Té
Utilizar gcc -v
y puede verificar la ruta de inclusión. Por lo general, los archivos de inclusión están en /usr/include
o /usr/local/include
dependiendo de la instalación de la biblioteca.

Xymostech
La mayoría de los encabezados estándar se almacenan en /usr/include
. Parece que stdbool.h
se almacena en otro lugar y depende del compilador que esté utilizando. Por ejemplo, g++ lo almacena en /usr/include/c++/4.7.2/tr1/stdbool.h
mientras que clang lo almacena en /usr/lib/clang/3.1/include/stdbool.h
.