Dove gcc cerca i file di intestazione C e C ++?

Su un sistema Unix, dove gcc cerca i file header?

Stamattina ho passato un po ‘di tempo a cercare alcuni file di intestazione di sistema, quindi ho pensato che sarebbe stata una buona informazione avere qui.

`gcc -print-prog-name=cc1plus` -v 

Questo comando chiede a gcc quale preprocessore C ++ sta usando, e poi chiede che il preprocessore dove cerca include.

Riceverai una risposta affidabile per la tua configurazione specifica.

Allo stesso modo, per il preprocessore C :

 `gcc -print-prog-name=cc1` -v 

Inoltre, gcc cercherà nelle directory specificate dopo l’opzione -I .

È ansible creare un file che tenti di includere un’intestazione di sistema fasulla. Se esegui gcc in modalità dettagliata su tale sorgente, elencherà tutte le posizioni di sistema incluse mentre cerca l’intestazione fasulla.

 $ echo "#include <bogus.h> int main(){}" > tc; gcc -v tc; rm tc [..] #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. [..] tc:1:32: error: bogus.h: No such file or directory 

La sezione CPP del manuale GCC indica che i file di intestazione possono trovarsi nelle seguenti directory:

GCC guarda in diversi posti per le intestazioni. Su un normale sistema Unix, se non lo istruisci diversamente, cercherà le intestazioni richieste con #include in:

  /usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include 

Per i programmi C ++, sarà anche in / usr / include / g ++ – v3, per prima cosa.

 g++ -print-search-dirs gcc -print-search-dirs 

Per fare in modo che GCC stampi il set completo di directory in cui cercherà le intestazioni di sistema, invocalo in questo modo:

 $ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | LC_ALL=C sed -ne '/starts here/,/End of/p' 

che produrrà l’output del modulo

 #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. 

Se si dispone di opzioni -I -family sulla riga di comando, influirà su ciò che viene stampato.

(Il comando sed è quello di sbarazzarsi di tutte le altre cianfrusaglie invocate da questa invocazione, e LC_ALL=C serve per garantire che il comando sed funzioni – le frasi “inizia qui” e “fine della lista di ricerca” sono tradotte IIRC.)

Il set di percorsi in cui il compilatore cerca i file di intestazione può essere controllato dal comando: –

cpp -v

Se si dichiara #include “” , il compilatore prima cerca nella directory corrente del file sorgente e, se non trovato, continua a cercare nelle directory recuperate sopra.

Se dichiari #include <> , il compilatore cerca direttamente in quelle directory ottenute dal comando precedente.

Fonte: – http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026

Si potrebbe visualizzare il percorso di inclusione (aggiuntivo) per un programma C da bash verificando quanto segue:

 echo $C_INCLUDE_PATH 

Se questo è vuoto, potrebbe essere modificato per aggiungere posizioni di inclusione predefinite, da:

 export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include 

Queste sono le directory che gcc cerca di default per i file header specificati (dato che i file header sono inclusi in chevrons <>); 1. / usr / local / include / –used per i file di intestazione di terze parti. 2. / usr / include / – utilizzato per i file di intestazione del sistema.

Se nel caso decidessi di mettere il tuo file di intestazione personalizzato in un posto diverso dalle directory sopra menzionate, puoi includerli come segue: 1. usando le virgolette (“./custom_header_files/foo.h”) con il percorso dei file, invece dei galloni nella dichiarazione di inclusione. 2. utilizzando l’opzione -I durante la compilazione del codice. gcc -I / home / utente / custom_headers / -c foo.c -p foo.o Fondamentalmente l’opzione -I dice al compilatore di cercare prima nella directory specificata con l’opzione -I (prima che controlli le directory standard) .Quando usando l’opzione -I i file di intestazione possono essere inclusi usando i galloni.