2014-10-16 4540 views
12

我正在使用GCC Linaro編譯器編譯我的代碼。它從libio.h投擲錯誤unknown type name size_t。它包括從stdio.h。在我的代碼中,我只包括stdio.hGCC linaro編譯器拋出錯誤「unknown type name size_t」

任何人都可以請如何解決這個錯誤。

+2

顯示您的代碼。沒有看到您的代碼,我們不禁感慨。 – 2014-10-16 17:32:56

+0

如果'size_t not found'錯誤來自我的代碼意思,我會完成'#define size_t unsigned long'來臨時編譯。但是這個錯誤來自這個系統頭文件'libio.h',它存在於這個編譯器中。 – rashok 2014-10-16 17:34:36

+1

您也可以使用'gcc -Wall -C -E'獲得預處理的表格,並使用'gcc -Wall -g -H'進行編譯以獲取包含的標題。 'libio.h'很可能不是編譯器特定的頭文件(但是是一個'libc'特定的頭文件) – 2014-10-16 17:35:38

回答

27

根據C99,§7.17,size_t不是內建類型,而是在<stddef.h>中定義的。

包括<stddef.h>標題應該可以解決您的問題。

2

對於它的價值,我在QT項目中遇到了同樣的問題,在那裏我使用Linaro編譯器(在x86 Windows和x86 Linux上)爲ARM Linux構建。使用完全相同的代碼和.pro文件,我沒有在Windows上構建任何問題,但是我在Linux上創建了大量的錯誤,從unknown type name 'size_t',libio.h開始,這個錯誤追溯到#include <stdio.h>。我查看了stdio.h(在目標硬件的sysroot中,而不是在主機上),並且幾行下來的是#include <stddef.h>(遠遠早於#include <libio.h>),所以stddef.h肯定包含在內。但是,經過進一步檢查,stddef.h完全爲空,文件大小爲1個字節。在我的sysroot和我的主機上,stddef.h是這樣的。我不知道爲什麼這些文件是空的。

無論如何,事實證明,我的.pro文件中有一個多餘的INCLUDEPATH += /usr/include/linux。在我的Linux構建機器上,這添加了-I/usr/include/linux到由qmake生成的Makefile。在我的Windows生成機器上,這添加了由qmake生成的Makefile的-isystem /usr/include/linux。一旦我評論了這一點,這些行就從Makefiles中刪除,並且直接在兩個構建機器上構建。顯然從未在Windows生成機器上造成任何麻煩,所以刪除INCLUDEPATH += /usr/include/linux並沒有什麼壞處。

我真的不知道爲什麼這解決了我的問題,但我懷疑這是頭文件之間的某種衝突。也許它是將主機頭文件與sysroot頭文件混合在一起,或者以某種方式創建循環依賴。 GCC文檔指出,-I選項包含的任何內容都將優先於系統頭文件。對於這個問題,我最好的建議是仔細查看哪些頭文件被包含在哪裏以及它們來自哪裏。