2010-04-05 13 views
12

Se voglio includere le directory per la ricerca di file di intestazione, che è il modo preferito e perché?-I dir vs. -isystem dir

+0

Inclusa o esclusa la libreria C standard host? –

+0

Né l'uno, né l'altro. Basta leggere nel manuale GCC sulle opzioni di pre-elaborazione e inciampare su questi due. – helpermethod

risposta

7

Dal gcc documentation for -I:

Aggiungere la directory dir alla testa della lista di directory da ricercare file di intestazione. Questo può essere usato per sovrascrivere un file di intestazione di sistema, sostituendo la propria versione, poiché queste directory vengono cercate prima delle directory dei file di intestazione di sistema. Tuttavia, non si dovrebbe usare questa opzione per aggiungere directory che contengono file di intestazione di sistema forniti dal fornitore (usare -isistema per questo). Se si utilizza più di un'opzione -I, le directory vengono scansionate nell'ordine da sinistra a destra; le directory di sistema standard vengono dopo.

Se un sistema standard include la directory o una directory specificata con -isystem, viene anche specificato con -I, l'opzione -I verrà ignorata. La directory verrà comunque ricercata, ma come una directory di sistema nella sua posizione normale nel sistema include la catena. Questo per garantire che la procedura di GCC per correggere le intestazioni di sistema buggy e l'ordine per la direttiva include_next non vengano inavvertitamente modificate. Se è davvero necessario modificare l'ordine di ricerca per le directory di sistema, utilizzare le opzioni -nostdinc e/o -isystem.

Così -I è probabilmente l'opzione preferita per specificare la posizione dei file di intestazione, ad eccezione di casi particolari come le intestazioni di sistema forniti dal produttore.

1

È necessario utilizzare -I per specificare la posizione delle intestazioni.

I file specificati con -isystem vengono cercati dopo -I viene elaborato e riceve un trattamento speciale da gcc (lo stesso delle intestazioni di sistema standard).

16

Un modo per visualizzare questo è utilizzare le intestazioni controllate con -I e quelle che non si (sistema, librerie di terze parti) con -isystem. La differenza pratica arriva quando gli avvisi sono abilitati in quanto gli avvisi che provengono dalle intestazioni -isystem verranno soppressi.

0

Quando si include un'intestazione "Myheader.h" utilizzando -I, il compilatore genera l'ordine di ricerca: "Myheader.h", "sistema/intestazioni". Quindi, se qualcosa non può essere trovato in "MyHeader.h" si fallback su "sistema/intestazioni". Comunque quando usi -isystem, stai praticamente dicendo che sostituisci "system/headers" con qualunque cosa ti dessi. Quindi non ci sono più ricadute su "sistema/intestazioni".