¿Dónde busca gcc los archivos de encabezado C y C ++?

En un sistema Unix, ¿dónde busca gcc los archivos de encabezado?

Pasé un poco de tiempo esta mañana buscando algunos archivos de encabezado del sistema, así que pensé que esta sería una buena información para tener aquí.

`gcc -print-prog-name=cc1plus` -v 

Este comando le pregunta a gcc qué preprocesador de C ++ está usando, y luego le pregunta a ese preprocesador dónde lo incluye.

Obtendrá una respuesta confiable para su configuración específica.

Del mismo modo, para el preprocesador C :

 `gcc -print-prog-name=cc1` -v 

Además, gcc buscará en los directorios especificados después de la opción -I .

Puede crear un archivo que intente incluir un encabezado de sistema falso. Si ejecuta gcc en modo detallado en dicha fuente, mostrará una lista de todas las ubicaciones incluidas en el sistema mientras busca el encabezado falso.

 $ echo "#include <bogus.h> int main(){}" > tc; gcc -v tc; rm tc [..] #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. [..] tc:1:32: error: bogus.h: No such file or directory 

La sección CPP del Manual de GCC indica que los archivos de encabezado pueden ubicarse en los siguientes directorios:

GCC busca en diferentes lugares encabezados. En un sistema Unix normal, si no le indica lo contrario, buscará los encabezados solicitados con #include en:

  /usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include 

Para los progtwigs en C ++, también se verá en / usr / include / g ++ – v3, primero.

 g++ -print-search-dirs gcc -print-search-dirs 

Para que GCC imprima el conjunto completo de directorios donde buscará los encabezados del sistema, inícielo así:

 $ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | LC_ALL=C sed -ne '/starts here/,/End of/p' 

que producirá salida de la forma

 #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 tiene opciones de -I -family en la línea de comando, afectarán lo que se imprime.

(El comando sed es deshacerse de todos los demás elementos no deseados que esta invocación imprime, y LC_ALL=C asegura que el comando sed funciona: las frases “comienza aquí” y “Fin de lista de búsqueda” se traducen IIRC).

El conjunto de rutas donde el comstackdor busca los archivos de encabezado se puede verificar mediante el comando:

cpp -v

Si declara #include “” , el comstackdor primero busca en el directorio actual del archivo fuente y si no se encuentra, continúa buscando en los directorios recuperados anteriormente.

Si declara #include <> , el comstackdor busca directamente en aquellos directorios obtenidos del comando anterior.

Fuente: – http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026

Uno podría ver la ruta de inclusión (adicional) para un progtwig en C desde bash al revisar lo siguiente:

 echo $C_INCLUDE_PATH 

Si esto está vacío, podría modificarse para agregar ubicaciones de inclusión predeterminadas, de la siguiente manera:

 export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include 

Estos son los directorios que gcc busca de manera predeterminada para los archivos de encabezado especificados (dado que los archivos de encabezado están incluidos en chevrones <>); 1. / usr / local / include / -used para archivos de encabezado de terceros. 2. / usr / include / – utilizado para los archivos de encabezado del sistema.

Si en caso de que decida colocar su archivo de encabezado personalizado en un lugar distinto a los directorios mencionados anteriormente, puede incluirlos de la siguiente manera: 1. usando comillas (“./custom_header_files/foo.h”) con la ruta de archivos, en lugar de chevrones en la statement de inclusión. 2. utilizando el modificador -I al comstackr el código. gcc -I / home / user / custom_headers / -c foo.c -p foo.o Básicamente, el modificador -I le dice al comstackdor que primero busque en el directorio especificado con el modificador -I (antes de que compruebe los directorios estándar) .Cuando usando el interruptor -I los archivos de encabezado pueden incluirse usando chevrones.