GCC Linaro编译器报错"unknown type name size_t"

36

我正在使用GCC Linaro编译器来编译我的代码。它报错 unknown type name size_t,报错来自于libio.h,而libio.h是从stdio.h中引用的。 在我的代码中,我只是包含了stdio.h

有没有人能告诉我如何解决这个错误。


4
请展示您的代码。如果我们看不到您的代码,我们将无法提供帮助。 - Basile Starynkevitch
如果我的代码出现“未找到size_t”错误,那么我会暂时使用#define size_t unsigned long进行编译。但是这个错误来自于系统头文件libio.h,该文件位于此编译器内部。 - rashok
1
你也可以使用 gcc -Wall -C -E 命令获取预处理后的形式,并使用 gcc -Wall -g -H 命令编译以获取包含的头文件。而 libio.h 很可能不是特定于编译器的头文件(而是特定于 libc 的)。 - Basile Starynkevitch
3
我不会在可以使用typedef的地方使用#define。 - user1171983
我之前没有听说过 libio.h。它存在于我的系统中,并且带有 #warning "<libio.h> is deprecated; use <stdio.h> instead." 的警告信息。不要使用它。 - Keith Thompson
3个回答

59
根据C99,§7.17的规定,size_t不是内置类型,而是在<stddef.h>中定义。
包含<stddef.h>头文件应该解决您的问题。

2
它也在<stdio.h>和其他几个标准头文件中定义。这个问题没有给我们足够的信息来确定编译器为什么会抱怨。 - Keith Thompson

10

就我所知,我曾遇到与QT相关的类似问题,当时我在Windows和Linux下使用Linaro编译器为ARM Linux构建代码,但是我在Windows上使用相同的代码和.pro文件进行构建没有任何问题,而在Linux上却遭遇了一系列错误,从libio.h中的unknown type name 'size_t'开始,可以追溯到#include <stdio.h>。 我查看了目标硬件sysroot下的stdio.h,并且在几行后找到了#include <stddef.h>(比#include <libio.h>更早),因此确实包含了stddef.h。 但是,进一步检查发现,stddef.h完全为空,并且文件大小为1个字节。 在我的sysroot和主机上,stddef.h都是如此。 我不知道这些文件为什么是空的。

无论如何,事实证明我的.pro文件中有一个多余的INCLUDEPATH += /usr/include/linux。 在我的Linux构建机器上,这将向由qmake生成的Makefile添加了-I/usr/include/linux。 在我的Windows构建机器上,这将向由qmake生成的Makefile添加了-isystem /usr/include/linux。 一旦我将其注释掉,这些行从Makefile中被移除,然后在两个构建机器上都成功构建了。 显然-isystem /usr/include/linux没有在Windows构建机器上造成麻烦,因此删除INCLUDEPATH += /usr/include/linux没有任何问题。

我不太清楚为什么这样修复了我的问题,但我怀疑这是一些头文件之间的冲突。可能是将主机头文件与sysroot头文件混合使用,或者以某种方式创建了循环依赖。GCC文档指出,任何用-I选项包含的内容都将优先于系统头文件。我的最佳建议是仔细查看正在包含哪些头文件以及它们来自何处。


1
我刚刚在构建ffmpeg,并尝试让某个头文件被识别,我将/usr/include/linux添加到包含目录中。后来我遇到了上述问题,通过您的答案,删除/usr/include/linux(并使用更适当的目录来获取所需的头文件)解决了问题。 - qdin

0

在C编程中,stdio.hstdlib.h都包含数据类型size_t。它们包含此数据类型是因为这些头文件中声明的函数要么将size_t作为参数,要么将其作为返回类型。 size_t本身是无符号整数类型的typedef,并且也由sizeof运算符返回。

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


1
sizeof 运算符产生某些实现定义的无符号整数类型的结果。该类型的名称 size_t 在几个标准头文件中定义,除非至少包含其中一个头文件,否则不可见。您的答案试图解释为什么 OP 提出的问题不可能发生,因此您没有回答问题。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接