27

我正在使用GCC Linaro编译器来编译我的代码。它unknown type name size_tlibio.h. 它包括从stdio.h. 在我的代码中,我只包括stdio.h.

任何人都可以请如何解决此错误。

4

3 回答 3

52

根据 C99 第 7.17 节,size_t它不是内置类型,而是在<stddef.h>.

包括<stddef.h>标题应该可以解决您的问题。

于 2014-10-16T20:24:36.413 回答
10

对于它的价值,我在 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 字节,完全为空。stddef.h在我的 sysroot 和主机上都是如此。我不知道为什么这些文件是空的。

无论如何,事实证明我的INCLUDEPATH += /usr/include/linux.pro 文件中有一个无关紧要的东西。在我的 Linux 构建机器上,这已添加-I/usr/include/linux到 qmake 生成的 Makefile 中。在我的 Windows 构建机器上,这已添加-isystem /usr/include/linux到 qmake 生成的 Makefile 中。一旦我将其注释掉,这些行就从 Makefile 中删除,并在两台构建机器上构建。 -isystem /usr/include/linux显然从未在 Windows 构建机器上造成任何问题,因此删除INCLUDEPATH += /usr/include/linux.

我真的不知道为什么这解决了我的问题,但我怀疑这是头文件之间的某种冲突。也许它正在混合主机头文件和 sysroot 头文件,或者以某种方式创建循环依赖。GCC 文档说选项中包含的任何内容都-I将优先于系统头文件。对于这个问题,我最好的建议是仔细查看包含哪些头文件以及它们来自哪里。

于 2016-08-30T23:17:34.147 回答
0

两者都stdio.h包括stdlib.h数据类型size_t。它们包含此数据类型,因为在这些标头中声明的函数要么将size_t其作为参数,要么将其作为返回类型返回。size_t本身是一个typedef无符号整数类型,它也由sizeof运算符返回。

而且由于sizeof运算符是内置在 C 编程语言本身中的,而不是通过某些库包含的,那么怎么可能size_t是未知的类型名称呢?

于 2018-12-30T20:18:49.650 回答