我正在使用GCC Linaro编译器来编译我的代码。它报错 unknown type name size_t
,报错来自于libio.h
,而libio.h
是从stdio.h
中引用的。 在我的代码中,我只是包含了stdio.h
。
有没有人能告诉我如何解决这个错误。
我正在使用GCC Linaro编译器来编译我的代码。它报错 unknown type name size_t
,报错来自于libio.h
,而libio.h
是从stdio.h
中引用的。 在我的代码中,我只是包含了stdio.h
。
有没有人能告诉我如何解决这个错误。
size_t
不是内置类型,而是在<stddef.h>
中定义。<stddef.h>
头文件应该解决您的问题。<stdio.h>
和其他几个标准头文件中定义。这个问题没有给我们足够的信息来确定编译器为什么会抱怨。 - Keith Thompson就我所知,我曾遇到与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
选项包含的内容都将优先于系统头文件。我的最佳建议是仔细查看正在包含哪些头文件以及它们来自何处。
在C编程中,stdio.h
和stdlib.h
都包含数据类型size_t
。它们包含此数据类型是因为这些头文件中声明的函数要么将size_t
作为参数,要么将其作为返回类型。 size_t
本身是无符号整数类型的typedef
,并且也由sizeof
运算符返回。
而且,由于sizeof
运算符是内置于C编程语言本身的,而不是通过某个库包含的,那么size_t
怎么可能是未知的类型名称呢?
sizeof
运算符产生某些实现定义的无符号整数类型的结果。该类型的名称 size_t
在几个标准头文件中定义,除非至少包含其中一个头文件,否则不可见。您的答案试图解释为什么 OP 提出的问题不可能发生,因此您没有回答问题。 - Keith Thompson
#define size_t unsigned long
进行编译。但是这个错误来自于系统头文件libio.h
,该文件位于此编译器内部。 - rashokgcc -Wall -C -E
命令获取预处理后的形式,并使用gcc -Wall -g -H
命令编译以获取包含的头文件。而libio.h
很可能不是特定于编译器的头文件(而是特定于libc
的)。 - Basile Starynkevitchlibio.h
。它存在于我的系统中,并且带有#warning "<libio.h> is deprecated; use <stdio.h> instead."
的警告信息。不要使用它。 - Keith Thompson