2009-12-14 7 views
10

Me pregunto cómo los compiladores en Mac OS X, Windows y Linux saben dónde encontrar los archivos de cabecera en C.¿Cómo saben los compiladores dónde encontrar #include <stdio.h>?

Específicamente Me pregunto cómo se sabe dónde encontrar el # include con los soportes <>.

#include "/Users/Brock/Desktop/Myfile.h" // absolute reference 
#include <stdio.h>       // system relative reference? 

Supongo que hay un archivo de texto en el sistema que consulta. ¿Cómo sabe dónde buscar los encabezados? ¿Es posible modificar este archivo? En caso afirmativo, ¿dónde reside este archivo en el sistema operativo?

+0

Ver mi respuesta a esa pregunta: Lo actualicé, y creo que debería funcionar para usted. –

+0

Editó su publicación nuevamente, lo que hace que mi comentario sea incomprensible. Esto es lo que estoy hablando: http://stackoverflow.com/questions/1898837/include-freeimage-h-not-found –

+0

@Alok Lo estoy probando ahora gracias –

Respuesta

10

Cuando se compila el compilador, conoce unas pocas ubicaciones estándar para buscar el archivo de encabezado. Algunos de ellos son independientes de dónde está instalado el compilador (como/usr/include,/usr/local/include, etc.) y algunos de ellos se basan en dónde está instalado el compilador (que para gcc, está controlado por el compilador). --opción de prefijo cuando se ejecuta configure).

lugares como/usr/include son bien conocidos y 'conocimiento' de que la ubicación está integrado en gcc. Las ubicaciones como/usr/local/include no se consideran completamente estándar y se pueden establecer cuando gcc se crea con la opción --with-local-prefix de configure.

Dicho esto, puede agregar nuevos directorios para dónde buscar los archivos de inclusión utilizando la opción de línea de comandos del compilador -I. Al tratar de incluir un archivo, buscará en los directorios especificados con el distintivo -I antes de los directorios de los que hablé en el primer párrafo.

4

La ubicación del archivo depende del sistema. De hecho, el archivo podría ser precompiled, o puede incluso no existir — el compilador puede tener como un 'built-in'. En mi MacBook, veo que hay un archivo de este tipo en /usr/include/c++/4.2.1/iostream, pero no se debe confiar en él, y sin duda es una mala ideapara editarla.

11

El sistema operativo no sabe dónde buscar estos archivos - el compilador (o más exactamente, el preprocesador). Tiene un conjunto de rutas de búsqueda donde sabe buscar encabezados, al igual que su shell de comandos tiene un conjunto de lugares donde buscará programas para ejecutar cuando escribe un nombre. The GCC documentation explains cómo lo hace ese compilador y cómo pueden cambiarse estas rutas de búsqueda.

+0

Votación hacia arriba para obtener buena información y buen enlace de recursos. Gracias Chuck – bobby

0

Si se utiliza g ++, se puede hacer algo como esto para averiguar lo que incluye caminos se hicieron búsquedas:

touch empty.cpp 
g++ -v empty.cpp 

No sé si hay un equivalente para Xcode. ¿Tal vez eso funcionará ya que Xcode se basa en GCC?

2

En Visual Studio, está en la configuración del proyecto si usa el IDE, o en la variable de entorno %INCLUDE% si usa la línea de comando.

0

Debe evitar #incluir archivos usando rutas absolutas. El compilador busca los archivos de inclusión en varios directorios e incluye archivos, comenzando desde cada directorio. Por ejemplo;

#include <boost/tokenizer.hpp> 

funciona porque el directorio raíz impulso contiene una carpeta llamada 'impulso' y que la carpeta está o en su defecto ruta de inclusión o que hizo algo similar.

g++ -I$BOOST_ROOT {blah, blah} 

Es C y C++ estándar que el separador de UNIX '/' funcionará de la misma manera para todos los sistemas, independientemente de lo que el sistema anfitrión utiliza para denotar realidad directorios. Como otros de los mencionados, ocasionalmente #include en realidad no incluye un archivo real en absoluto.

Cuestiones relacionadas