I am using GCC Linaro compiler for compiling my code. Its throwing the error unknown type name size_t
from libio.h
. Its included from stdio.h
. In my code I am just including stdio.h
.
Can any one please how to resolve this error.
I am using GCC Linaro compiler for compiling my code. Its throwing the error unknown type name size_t
from libio.h
. Its included from stdio.h
. In my code I am just including stdio.h
.
Can any one please how to resolve this error.
As per C99, §7.17,
size_t
is not a builtin type but defined in<stddef.h>
.Including the
<stddef.h>
header should fix your problem.Both
stdio.h
andstdlib.h
include the data typesize_t
. They include this data type because the functions declared in these headers either takesize_t
as a parameter, or return it as a return type.size_t
itself is atypedef
to an unsigned integral type and it's also returned by thesizeof
operator.And because the
sizeof
operator is built into the C Programming Language itself, not included via some library, then how cansize_t
be an unknown type name?For what it's worth, I had this exact same problem with a QT project, where I was using a Linaro compiler to (on both x86 Windows and x86 Linux) build for ARM Linux. Using the exact same code and .pro file, I had no problems building on Windows, but I had a litany of errors building on the Linux box, beginning with the
unknown type name 'size_t'
inlibio.h
which traced back to a#include <stdio.h>
. I looked in thestdio.h
(in the sysroot for the target hardware, not on the host machine), and a few lines down was#include <stddef.h>
(much before#include <libio.h>
), sostddef.h
was definitely getting included. However, upon further inspection,stddef.h
was completely empty with a file size of 1 byte. This was true forstddef.h
in my sysroot and on my host machine. I have no idea why these files were empty.Anyway, turns out I had an extraneous
INCLUDEPATH += /usr/include/linux
in my .pro file. On my Linux build machine, this added-I/usr/include/linux
to the Makefile generated by qmake. On my Windows build machine, this added-isystem /usr/include/linux
to the Makefile generated by qmake. Once I commented this out, these lines were removed from the Makefiles and it built right up on both build machines.-isystem /usr/include/linux
apparently never caused any trouble on the Windows build machine, so there was no harm in removingINCLUDEPATH += /usr/include/linux
.I don't really know why this fixed my problem, but I suspect it was some kind of conflict between header files. Perhaps it was mixing host header files with sysroot header files, or creating a circular dependency somehow. GCC documentation says that anything included with the
-I
option will take precedence over a system header file. My best advice for this problem is to take a hard look at exactly which header files are being included and where they are coming from.