2010-04-05 23 views
12

Si quiero incluir directorios para buscar archivos de encabezado, ¿cuál es la forma preferida y por qué?-I dir vs. -system dir

+0

Incluyendo o excluyendo la biblioteca estándar C de host? –

+0

Ni uno, ni el otro. Simplemente lea en el manual de GCC sobre las opciones de preprocesamiento y tropecé con estos dos. – helpermethod

Respuesta

7

Desde el gcc documentation for -I:

Añadir el directorio dir a la cabeza de la lista de directorios que se debe buscar los archivos de cabecera. Esto se puede utilizar para anular un archivo de encabezado del sistema, sustituyendo su propia versión, ya que estos directorios se buscan antes que los directorios del archivo de encabezado del sistema. Sin embargo, no debe usar esta opción para agregar directorios que contengan archivos de encabezado de sistema proporcionados por el proveedor (use -isystem para eso). Si usa más de una opción -I, los directorios se escanean en orden de izquierda a derecha; los directorios del sistema estándar vienen después.

Si un sistema estándar incluye un directorio, o un directorio especificado con -isistema, también se especifica con -I, se ignorará la opción -I. El directorio aún se buscará, pero como un directorio del sistema en su posición normal en el sistema, incluya la cadena. Esto es para garantizar que el procedimiento de GCC para reparar encabezados de sistema defectuosos y el orden de la directiva include_next no se cambien inadvertidamente. Si realmente necesita cambiar el orden de búsqueda de los directorios del sistema, use las opciones -nostdinc y/o -isystem.

Por lo tanto, -I es probablemente la opción preferida para especificar la ubicación de los archivos de encabezado, excepto en casos especiales, como los encabezados de sistema proporcionados por el proveedor.

1

Debe usar -I para especificar la ubicación de sus encabezados.

Los archivos que especifique con -isystem se buscan después -Me procesa y recibo un tratamiento especial por gcc (lo mismo que los encabezados de sistema estándar).

16

Una forma de ver esto es usar los encabezados que controla con -I y los que no (sistema, libs de terceros) con -isystem. La diferencia práctica se produce cuando las advertencias están habilitadas porque las advertencias que provienen de los encabezados -isystem serán suprimidas.

0

Cuando incluye un encabezado "Myheader.h" con -I, el compilador genera el orden de búsqueda: "Myheader.h", "system/headers". Entonces, si no se puede encontrar algo en "MyHeader.h", recurrirá a "system/headers". Sin embargo, cuando usas -isystem, básicamente estás diciendo que reemplazas "system/headers" con lo que te doy. Así que ya no hay más recurrir a "sistema/encabezados".

Cuestiones relacionadas