2016-05-11 59 views
5

Ho compilato la libreria standard di gnu e l'ho installata in $GLIBC_INST.Perché stddef.h non è in/usr/include?

Ora, provo a compilare un molto semplice programma (utilizzando una sola #include: #include <stdio.h>):

gcc --nostdinc -I$GLIBC_INST/include foo.c 

La compilazione (? Preprocessore) mi dice che non trova stddef.h.

E in effetti, non c'è nessuno in $GLIBC_INST/include (né ce n'è uno in /usr/include). Tuttavia, ho trovato uno stddef.h in /usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include.

Perché questo file non è sotto /usr/include? Ho pensato che appartenesse alla libreria c standard e dovrebbe essere installato in $GLIBC_INST/include.

Come posso compilare il mio foo.c con la libreria standard appena installata quando non sembra venire con un stddef.h?

Edit: Chiarimento

credo che il titolo di questa interrogazione non è ottimale. Come è stato sottolineato da alcune risposte, non vi è alcun obbligo per stddef.h di essere in /usr/include (o $GLIBC_INST/include, per quella materia). Lo capisco.

Ma mi chiedo come posso procedere quando voglio usare $GLIBC_INST. Mi sembra ovvio (anche se potrei sbagliarmi qui) che ho bisogno di invocare gcc con --nostdinc per non utilizzare i file di intestazione installati dal sistema. Ciò comporta che io uso -I$GLIB_INST/include. Questo è chiaro per me.

Tuttavia, ciò che rimane poco chiaro per me è: quando aggiungo anche -I/usr/lib/gcc/x86..../include, come posso essere sicuro di avere effettivamente i file di intestazione più recenti per gli glibc appena compilati?

+0

Potresti confermare che 'gcc' punta effettivamente alla tua installazione 5.3.0, ad esempio, con' quale gcc'? –

+0

Se si aggiunge l'opzione '-I', il compilatore guarda prima al percorso di inclusione aggiunto prima di esaminare le directory standard. Usando '--nostdinc' sei sicuro che stai usando le intestazioni appena installate. – LPs

+0

Inoltre, vedere http://stackoverflow.com/questions/31285258/why-usr-include-linux-stddef-h-is-empty –

risposta

4

Questo perché i file sotto /usr/include sono intestazioni comuni fornite dalla libreria C, ad esempio glibc, mentre i file in /usr/lib/gcc sono specifici per quel particolare compilatore. È normale che ogni compilatore abbia la propria implementazione diversa da stddef.h, ma utilizzeranno lo stesso stdio.h quando si collegano alla libreria C installata.

+1

Potrei aggiungere che 'gcc --print-file-name = include' stampa il percorso per 'stddef.h'. –

+0

Giusto, gcc può farlo con l'opzione. – fluter

4

Quando si dice #include <stddef.h> non è necessario che /usr/include/stddef.h esista come un file su disco. Tutto ciò che è richiesto per un'implementazione è che #include <stddef.h> funzioni e che ti fornisce le funzionalità che l'intestazione è pensata per darti.

Nel tuo caso, l'implementazione ha inserito alcuni dei suoi file in un altro percorso di ricerca. È piuttosto tipico.

3

Perché questo file non è sotto /usr/include?

Perché non è assolutamente necessario che le intestazioni standard siano posizionate su /usr/include/.

L'implementazione potrebbe posizionarli ovunque.L'unica garanzia è che quando si esegue #include <stddef.h>, il compilatore/preprocessore lo localizzi correttamente e lo includa. Dal momento che lo disabiliti con l'opzione di gcc, sei da solo (per dare correttamente la posizione di quell'intestazione).