2008-12-05 24 views
144

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

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í.

+1

¡Información útil para tener! Gracias por esto. –

Respuesta

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

Este comando pide GCC que C++ preprocesador que está utilizando y, a continuación, pide que preprocesador donde se busca incluye.

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

mismo modo, para la C preprocesador:

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

¿Qué significan los 's? Me resulta difícil buscar esto. – mijiturka

+7

@mijiturka [¿Qué significa '(backquote/backtick) significa en bash?] (Http://unix.stackexchange.com/questions/27428/what-does-backquote-backtick-mean-in-bash) –

+4

Supongo que el C ** preprocesador ** es 'cpp' en lugar de' cc1'? En mi Debian jessie '$ (gcc -print-prog-name = cpp) -v' (correctamente) da una ruta más, que es'/usr/include/x86_64-linux-gnu' – wlnirvana

16

El CPP Section del GCC Manual indica que los archivos de cabecera pueden estar situados en los siguientes directorios:

GCC busca en varios sitios diferentes para los encabezados. En un sistema normal de Unix, si no se indique lo contrario, se buscará cabeceras solicitados con # include en:

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

Para programas en C++, sino que también se verá en/usr/include/g ++ - v3, primero.

+0

Eso está bien para su versión actual de gcc. Los directorios reales en los que se ve dependen de las opciones especificadas cuando se compiló gcc. Vea la respuesta de Shmoopty para una mejor solución. –

+0

PD: Mis archivos de encabezado de C++ están en: /usr/include/c++/4.0.0 –

+2

@Martin: Eres de la vieja escuela. Los míos están en /usr/include/c++/4.2 :) –

26

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


+1

Gracias. Esa es una buena información para agregar. –

+2

@totaam: ¡comprueba tu fuente! Esta respuesta utiliza "-I" ("ojo" de capital) no "-l" ("ell" de minúscula). –

+1

-I es para mientras que -library es para "quotedfiles.h" –

23

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(){}" > 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 
+0

Creo que esto sería más útil si acabas de decir "usa la opción -v". –

+0

Bueno, si usa "-v" sin un archivo C que incluya un encabezado de sistema inexistente, no hará que gcc repita todas las rutas incluidas. La clave de mi respuesta es bogus.h enumerada como encabezado del sistema. – diciu

+0

@Jay - tienes razón, era demasiado vago - He explicado lo que estaba haciendo en el script de shell. – diciu

0

Uno podría ver el (adicional) incluir ruta de acceso para un programa en C de golpe por el control de los siguientes:

echo $C_INCLUDE_PATH 

Si este está vacío, se puede modificar para agregar ubicaciones de inclusión predeterminadas, por:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include 
5

Para obtener GCC para imprimir el conjunto completo de los directorios donde se buscará cabeceras de sistema, invocar esta manera:

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

que producirá la 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 -I -family options en la línea de comandos afectarán lo que está impreso.

(El comando sed es deshacerse de todos los otros basura esta imagen Impresiones de invocación y el LC_ALL=C es asegurar que el comando funciona sed - el "comienza aquí" y "fin de la lista de búsqueda" frases son IIRC traducida)

4
g++ -print-search-dirs 
gcc -print-search-dirs 
1

el conjunto de caminos donde el compilador busca los archivos de cabecera se puede comprobar por el comando: -.

CPP -v

Si se declara # include "", las primeras búsquedas del compilador en el directorio actual del archivo de origen y si no lo encuentra, sigue buscando en los directorios recuperados anteriores.

Si se declara # include <>, las búsquedas del compilador directamente en esos directorios obtenidos del comando anterior.

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

0

Estos son los directorios que mira en gcc por defecto para los archivos de cabecera especificadas (dado que los archivos de cabecera se incluyen en galones <>); 1./usr/local/include/--utilizado para archivos de encabezado de terceros. 2./usr/include/- utilizado para 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 archivos ruta, en lugar de chevrones en la instrucción include. 2. usando el modificador -I al compilar el código. gcc -I/home/user/custom_headers/-c foo.c -p foo.o Básicamente, el modificador -I le dice al compilador que primero busque en el directorio especificado con el modificador -I (antes de que compruebe los directorios estándar) . Cuando use el modificador I, los archivos de encabezado se pueden incluir usando chevrones.

Cuestiones relacionadas