Я использую компилятор GCC Linaro для компиляции моего кода. Выброс ошибки unknown type name size_t
из libio.h
. Его включили из stdio.h
. В моем коде я просто включаю stdio.h
.
Можно ли разрешить эту ошибку.
Я использую компилятор GCC Linaro для компиляции моего кода. Выброс ошибки unknown type name size_t
из libio.h
. Его включили из stdio.h
. В моем коде я просто включаю stdio.h
.
Можно ли разрешить эту ошибку.
В соответствии с C99, §7.17, size_t
не является встроенным типом, но определяется в <stddef.h>
.
Включение заголовка <stddef.h>
должно устранить вашу проблему.
Для чего это стоит, у меня была такая же проблема с проектом 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 и на моем хост-машине. Я не знаю, почему эти файлы были пустыми.
В любом случае, получается, что в моем файле .pro был посторонний INCLUDEPATH += /usr/include/linux
. На моей машине для сборки Linux это добавило -I/usr/include/linux
в Makefile, сгенерированный qmake. На моей машине для сборки Windows это добавило -isystem /usr/include/linux
в Makefile, сгенерированный qmake. Как только я прокомментировал это, эти строки были удалены из Make файлов, и они были построены на обеих машинах сборки. -isystem /usr/include/linux
, по-видимому, никогда не вызывал никаких проблем на машине для сборки Windows, поэтому при удалении INCLUDEPATH += /usr/include/linux
не было вреда.
Я действительно не знаю, почему это устранило мою проблему, но я подозреваю, что это был какой-то конфликт между заголовочными файлами. Возможно, это было смешивание файлов заголовков хоста с файлами заголовков sysroot или каким-то образом созданием циклической зависимости. В документации GCC говорится, что все, что включено в параметр -I
, будет иметь приоритет над файлом заголовка системы. Мой лучший совет по этой проблеме - внимательно изучить, какие заголовочные файлы включены и откуда они идут.