Su un sistema Unix, dove gcc cerca i file header?
Ho trascorso un po 'di tempo questa mattina a cercare alcuni file di intestazione del sistema, quindi ho pensato che sarebbe stata una buona informazione avere qui.
Su un sistema Unix, dove gcc cerca i file header?
Ho trascorso un po 'di tempo questa mattina a cercare alcuni file di intestazione del sistema, quindi ho pensato che sarebbe stata una buona informazione avere qui.
Risposte:
`gcc -print-prog-name=cc1plus` -v
Questo comando chiede a gcc quale preprocessore C ++ sta usando, quindi chiede a quel preprocessore dove cerca include.
Riceverai una risposta affidabile per la tua configurazione specifica.
Allo stesso modo, per il preprocessore C :
`gcc -print-prog-name=cpp` -v
cpp
invece di cc1
? Sul mio debian jessie $(gcc -print-prog-name=cpp) -v
(correttamente) dà un altro percorso, che è/usr/include/x86_64-linux-gnu
/dev/null
, quindi `gcc -print-prog-name=cc1` -v < /dev/null
.
Ctrl
+ D
, che invia "end of file" in Unix-talk.
Inoltre, gcc cercherà nelle directory specificate dopo l' -I
opzione.
È possibile creare un file che tenti di includere un'intestazione di sistema fasulla. Se esegui gcc in modalità dettagliata su una fonte simile, elencherà tutte le posizioni di inclusione del sistema mentre cerca l'intestazione fasulla.
$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c
[..]
#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.
[..]
t.c:1:32: error: bogus.h: No such file or directory
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
o cpp -v < /dev/null
sono abbastanza. Devi solo per arrivare al preprocessore di correre , non importa quello di ingresso che vede. (I percorsi di ricerca vengono stampati durante l'avvio, prima ancora che guardi il suo input.)
La sezione CPP del Manuale GCC indica che i file di intestazione possono trovarsi nelle seguenti directory:
GCC cerca diverse intestazioni per le intestazioni. Su un normale sistema Unix, se non lo si istruisce 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 ++, per prima cosa cercherà anche in / usr / include / g ++ - v3.
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 -I
nella riga di comando sono presenti opzioni per la famiglia, ciò influirà su ciò che viene stampato.
(Il sed
comando è di sbarazzarsi di tutte le altre cianfrusaglie stampate da questa invocazione, e LC_ALL=C
di assicurarsi che il sed
comando funzioni: le frasi "inizia qui" e "Fine dell'elenco di ricerca" sono tradotte IIRC.)
g++ -print-search-dirs
gcc -print-search-dirs
L'insieme di percorsi in cui il compilatore cerca i file di intestazione può essere verificato dal comando: -
cpp -v
Se si dichiara #include "" , il compilatore cerca prima nella directory corrente del file sorgente e, se non viene 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
È possibile visualizzare il percorso (aggiuntivo) di inclusione di un programma C da bash verificando quanto segue:
echo $C_INCLUDE_PATH
Se è vuoto, potrebbe essere modificato per aggiungere posizioni di inclusione predefinite, mediante:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
Queste sono le directory in cui gcc cerca per impostazione predefinita i file di intestazione specificati (dato che i file di intestazione sono inclusi in galloni <>); 1. / usr / local / include / --used per file di intestazione di terze parti. 2. / usr / include / - utilizzato per i file di intestazione del sistema.
Se nel caso in cui decidessi di posizionare il tuo file di intestazione personalizzato in un posto diverso dalle directory sopra menzionate, puoi includerle come segue: 1. usando le virgolette ("./custom_header_files/foo.h") con il percorso dei file, anziché i galloni nell'istruzione include. 2. utilizzando l'opzione -I durante la compilazione del codice. gcc -I / home / user / custom_headers / -c foo.c -p foo.o Fondamentalmente l'opzione -I dice al compilatore di guardare prima nella directory specificata con l'opzione -I (prima che controlli le directory standard). usando l'opzione -I i file di intestazione possono essere inclusi usando i galloni.