2009-08-02 19 views
60

lo tanto, cuando hacemos lo siguiente:¿Dónde están almacenados los archivos de inclusión - Ubuntu Linux, GCC

#include <stdio.h> 

frente

#include "myFile.h" 

el compilador GCC en mi caso, que sabe dónde stdio.h (e incluso el archivo de objeto) se encuentran en mi disco duro. Simplemente utiliza los archivos sin interacción de mí.

I piensa que en mi máquina Ubuntu Linux los archivos están almacenados en /usr/include/. ¿Cómo sabe el compilador dónde buscar estos archivos? ¿Es esto configurable o solo es el valor predeterminado esperado? ¿Dónde buscaría esta configuración?

Como estoy haciendo una pregunta sobre estos archivos de inclusión, ¿cuál es la fuente de los archivos? Sé que esto podría ser confuso en la comunidad Linux, pero ¿quién los maneja? Quién proporcionaría y gestionaría los mismos archivos para un compilador de Windows.

Siempre tuve la impresión de que vienen con el compilador, pero que era una suposición ...

Respuesta

40

Ver aquí: Search Path

Resumen:

#include <stdio.h> 

Cuando el incluir archivo está entre paréntesis, el preprocesador busca primero en las rutas especificadas a través del indicador -I. Luego busca en las rutas de inclusión estándar (consulte el enlace anterior y use el indicador -v para probarlo en su sistema).

#include "myFile.h" 

Cuando el archivo de inclusión está entre comillas las primeras búsquedas de preprocesador en el directorio actual, entonces caminos especificados por -iquote, entonces -I caminos, entonces los caminos estándar.

-nostdinc se puede utilizar para evitar que el preprocesador busque las rutas estándar en absoluto.

Environment variables también se puede utilizar para agregar rutas de búsqueda.

Al compilar si usa el indicador -v, puede ver las rutas de búsqueda utilizadas.

7

Karl respondió a su pregunta de ruta de búsqueda, pero en cuanto a la "fuente de los archivos", una cosa a tener en cuenta es que si instala el paquete libfoo y desea hacer algún desarrollo con él (es decir, use sus encabezados), también necesitará instalar libfoo-dev. Los archivos de encabezado de biblioteca estándar ya están en /usr/include, como viste.

Tenga en cuenta que algunas bibliotecas con muchos encabezados las instalarán en un subdirectorio, por ejemplo, /usr/include/openssl.Para incluir una de esas, simplemente proporcionar la ruta sin la parte /usr/include, por ejemplo:

#include <openssl/aes.h> 
41

gcc es un programa rico y complejo "orquestar" que llama a muchos otros programas para realizar sus funciones. Con el propósito específico de ver donde #include "goo" y #include <zap> buscará en su sistema, recomiendo:

$ touch a.c 
$ gcc -v -E a.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. 
# 1 "a.c" 

Esta es una manera de ver las listas de búsqueda de archivos incluidos, entre ellos (en su caso) los directorios en los que #include "..." mirarán pero #include <...> no lo hará. Esta lista específica que estoy mostrando es en realidad en Mac OS X (también conocido como Darwin) pero los comandos que recomiendo le mostrarán las listas de búsqueda (así como detalles de configuración interesantes que he reemplazado con ... aquí ;-) en cualquier sistema en que gcc funciona correctamente

+3

¿Puede explicar dónde, según GCC sabe, buscar en/Library/Frameworks en el ejemplo que proporcionó? Digamos que está codificado para buscar en/usr/include y/usr/local/include, pero ¿de dónde vienen los directorios adicionales? Del medio ambiente? – rlib

1

Los archivos \#include de gcc se almacenan en /usr/include. Los archivos de inclusión estándar de g ++ se almacenan en /usr/include/c++.

Cuestiones relacionadas