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


186

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:


227
`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

2
Cosa significa "s"? Sto trovando difficile cercare questo.
mijiturka,


5
Immagino che il preprocessore C sia cppinvece di cc1? Sul mio debian jessie $(gcc -print-prog-name=cpp) -v(correttamente) dà un altro percorso, che è/usr/include/x86_64-linux-gnu
wlnirvana

3
Se vuoi che non si blocchi in attesa dell'input, reindirizza l'input da /dev/null, quindi `gcc -print-prog-name=cc1` -v < /dev/null.
Steve Jorgensen,

@SteveJorgensen yep! Oppure premi Ctrl+ D, che invia "end of file" in Unix-talk.
Ha disegnato Dormann il

40

Inoltre, gcc cercherà nelle directory specificate dopo l' -Iopzione.



4
@totaam: controlla il tuo carattere! Questa risposta usa "-I" ("occhio" maiuscolo) non "-l" ("ell" minuscolo).

3
-I è per <anglebracketed.h> mentre -iquote è per "quotedfiles.h"
jcomeau_ictx

28

È 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

3
Penso che ciò sarebbe più utile se dicessi "usa l'opzione -v".
Jay Conrod,

Bene, se usi "-v" senza un file C che include un'intestazione di sistema inesistente, non farai iterare gcc attraverso tutti i percorsi di inclusione. La chiave della mia risposta è bogus.h elencato come intestazione di sistema.
diciu,

@Jay - hai ragione, era troppo vago - ho spiegato cosa stavo facendo nella shell script.
diciu,

9
senza file temporanei:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe

2
gcc -v -E - < /dev/nullo cpp -v < /dev/nullsono 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.)
zwol

17

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.


Va bene per la tua versione attuale di gcc. Le directory effettive in cui si trova dipende dalle opzioni specificate al momento della creazione di gcc. Vedi la risposta di Shmoopty per una soluzione migliore.
Martin York,

PS: I miei file di intestazione C ++ sono in: /usr/include/c++/4.0.0
Martin York,

3
@Martin: sei vecchia scuola. I miei sono in /usr/include/c++/4.2 :)
Bill the Lizard

10

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 -Inella riga di comando sono presenti opzioni per la famiglia, ciò influirà su ciò che viene stampato.

(Il sedcomando è di sbarazzarsi di tutte le altre cianfrusaglie stampate da questa invocazione, e LC_ALL=Cdi assicurarsi che il sedcomando funzioni: le frasi "inizia qui" e "Fine dell'elenco di ricerca" sono tradotte IIRC.)


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

3
Questi comandi stampano i percorsi di ricerca predefiniti per le librerie dei collegamenti e i componenti interni del compilatore; non ti dicono nulla sui file di intestazione.
zwol,

6

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


1

È 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

1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.