2014-10-16 18 views
12

Sto utilizzando il compilatore GCC Linaro per la compilazione del mio codice. Il suo lancio l'errore unknown type name size_t da libio.h. È incluso da stdio.h. Nel mio codice sto solo includendo stdio.h.Il compilatore GTO di linaro genera l'errore "nome tipo sconosciuto size_t"

Qualcuno può piacere come risolvere questo errore.

+2

Mostra il tuo codice. Non possiamo aiutare senza vedere il tuo codice. –

+0

Se l'errore 'size_t not found' è dal mio codice significa, avrei dovuto' #define size_t unsigned long' per la compilazione temporanea. Ma questo errore proviene da questo file di intestazione di sistema 'libio.h' presente in questo compilatore. – rashok

+1

Si potrebbe anche ottenere il modulo preelaborato con 'gcc -Wall -C -E' e compilare con' gcc -Wall -g -H' per ottenere le intestazioni incluse. E 'libio.h' molto probabilmente non è un'intestazione specifica per il compilatore (ma uno specifico per' libc') –

risposta

27

Come da C99, §7.17, size_t non è un tipo incorporato ma definito in <stddef.h>.

Includere l'intestazione <stddef.h> dovrebbe risolvere il problema.

2

Per quello che vale, ho avuto lo stesso identico problema con un progetto QT, dove stavo usando un compilatore Linaro per (su entrambi x86 Windows e x86 Linux) build per ARM Linux. Usando lo stesso codice esatto e il file .pro, non ho avuto problemi a costruire su Windows, ma ho avuto una litania di errori nel costruire Linux, a cominciare dallo unknown type name 'size_t' in libio.h che risaliva a un #include <stdio.h>. Ho guardato nello stdio.h (nel sysroot per l'hardware di destinazione, non sul computer host) e alcune righe in basso erano #include <stddef.h> (molto prima dello #include <libio.h>), quindi lo stddef.h è stato sicuramente incluso. Tuttavia, dopo un'ulteriore ispezione, stddef.h era completamente vuoto con una dimensione del file di 1 byte. Questo era vero per stddef.h nel mio sysroot e sul mio computer host. Non ho idea del motivo per cui questi file erano vuoti.

In ogni caso, si è verificato un estraneo INCLUDEPATH += /usr/include/linux nel mio file .pro. Sul mio computer di compilazione Linux, questo ha aggiunto -I/usr/include/linux al Makefile generato da qmake. Sul mio computer Windows build, questo ha aggiunto -isystem /usr/include/linux al Makefile generato da qmake. Una volta commentato, queste linee sono state rimosse dai Makefile e sono state costruite direttamente su entrambe le macchine di compilazione. -isystem /usr/include/linux a quanto pare non ha mai causato alcun problema sul computer di Windows, quindi non ci sono stati problemi nella rimozione di INCLUDEPATH += /usr/include/linux.

Non so davvero perché questo ha risolto il problema, ma sospetto che si tratti di una sorta di conflitto tra i file di intestazione. Forse stava mixando i file header dell'host con i file header di sysroot, o creando in qualche modo una dipendenza circolare. La documentazione GCC dice che tutto ciò che è incluso nell'opzione -I avrà la precedenza su un file di intestazione di sistema. Il mio miglior consiglio per questo problema è dare un'occhiata a quali file di intestazione vengono inclusi e da dove provengono.