【问题标题】:GCC linaro compiler throws error "unknown type name size_t"GCC linaro 编译器抛出错误“未知类型名称 size_t”
【发布时间】:2014-12-12 04:16:24
【问题描述】:

我正在使用GCC Linaro 编译器来编译我的代码。它从libio.h 抛出错误unknown type name size_t。它包含在stdio.h 中。在我的代码中,我只包含stdio.h。

谁能请教如何解决这个错误。

【问题讨论】:

  • 显示您的代码。如果没有看到您的代码,我们将无法提供帮助。
  • 如果 size_t not found 错误来自我的代码意味着,我会做 #define size_t unsigned long 临时编译。但是这个错误来自这个编译器内部的系统头文件libio.h。
  • 您还可以使用gcc -Wall -C -E 获取预处理表单并使用gcc -Wall -g -H 进行编译以获取包含的标题。 libio.h 很可能不是特定于编译器的头文件(而是 libc 特定的头文件)
  • @raja ashok 我永远不会在可以使用 typedef 的地方使用 #define。
  • 我没听说过libio.h。它存在于我的系统上,带有#warning "<libio.h> is deprecated; use <stdio.h> instead."。不要使用它。

标签: c gcc compiler-errors size-t linaro


【解决方案1】:

根据 C99 §7.17,size_t 不是内置类型,而是在 <stddef.h> 中定义。

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

【讨论】:

  • 它也在<stdio.h> 和其他几个标准头文件中定义。这个问题没有给我们足够的信息来确定编译器为什么抱怨。
【解决方案2】:

对于它的价值,我在 QT 项目中遇到了同样的问题,我使用 Linaro 编译器(在 x86 Windows 和 x86 Linux 上)为 ARM Linux 构建。使用完全相同的代码和 .pro 文件,我在 Windows 上构建没有任何问题,但我在 Linux 机器上构建了一连串错误,从 libio.h 中的 unknown type name 'size_t' 开始,可以追溯到 #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 构建机器上,这会将 -isystem /usr/include/linux 添加到 qmake 生成的 Makefile 中。一旦我将其注释掉,这些行就从 Makefile 中删除,并在两台构建机器上构建。 -isystem /usr/include/linux 显然从未在 Windows 构建机器上造成任何问题,因此删除 INCLUDEPATH += /usr/include/linux 并没有什么坏处。

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

【讨论】:

  • 我只是在构建 ffmpeg,并且试图让某个头文件被识别,我将 /usr/include/linux 添加到包含目录中。后来我遇到了上述问题,通过你的回答,删除 /usr/include/linux (并为所需的头文件使用更合适的目录)解决了这个问题。
【解决方案3】:

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

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

【讨论】:

  • sizeof 运算符产生一些实现定义的无符号整数类型的结果。该类型的名称size_t 在几个标准标头中定义,除非至少包含其中一个标头,否则它是不可见的。您的回答试图解释为什么 OP 询问的问题不会发生,所以您没有回答问题。
猜你喜欢
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 2017-04-04
  • 1970-01-01
相关资源
最近更新 更多