Pregunta

Me pregunto cómo los compiladores en Mac OS X, Windows y Linux saben dónde encontrar los archivos de cabecera C.

En concreto 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?

Asumo que hay un archivo de texto en el sistema que se consulta. ¿Cómo sabe dónde buscar las cabeceras? ¿Es posible modificar este archivo, si es así, ¿dónde reside este archivo en el sistema operativo?

¿Fue útil?

Solución

Cuando el compilador se construye, se sabe de unos pocos lugares estándar para buscar el archivo de cabecera. Algunos de ellos son independientes de donde está instalado el compilador (como / usr / incluir, / usr / local / incluyen, etc.) y algunos de los se basan en donde está instalado el compilador (que para gcc, está controlado por el opción --prefix cuando se ejecuta configure).

Lugares como / usr / include son bien conocidos y 'conocimiento' de que la ubicación está integrado en gcc. Lugares como / usr / local / include no se considera completamente estándar y se pueden configurar cuando se construye GCC con la opción --with-local-prefijo de configuración.

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

Otros consejos

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 en los que ya a buscar las cabeceras, al igual que su consola de comandos tiene un conjunto de lugares donde va a buscar los programas a ejecutar cuando se escribe en un nombre. La documentación de GCC explica cómo que el compilador lo hace y cómo estas rutas de búsqueda puede ser cambiado.

La ubicación del archivo depende del sistema. De hecho, el archivo podría ser precompiled , o puede que no, incluso 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 un mala idea para editarla.

En Visual Studio, que es ya sea en la configuración del proyecto si se utiliza el IDE o en la variable de entorno %INCLUDE% si utiliza la línea de comandos.

Si se utiliza g ++, se podría 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 que trabajará desde Xcode se basa en GCC?

Se debe evitar # include-ing archivos utilizando rutas absolutas. Los compilador busca los archivos de inclusión en varios directorios y archivos incluye, a partir de cada directorio. Por ejemplo;

#include <boost/tokenizer.hpp>

Funciona porque el directorio raíz del 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, en ocasiones # include en realidad no incluyen un archivo real en absoluto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top