GCC linaro компилятор выдает ошибку "неизвестный тип name size_t"

Я использую компилятор GCC Linaro для компиляции моего кода. Выброс ошибки unknown type name size_t из libio.h. Его включили из stdio.h. В моем коде я просто включаю stdio.h.

Можно ли разрешить эту ошибку.

Ответ 1

В соответствии с C99, §7.17, size_t не является встроенным типом, но определяется в <stddef.h>.

Включение заголовка <stddef.h> должно устранить вашу проблему.

Ответ 2

Для чего это стоит, у меня была такая же проблема с проектом 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, будет иметь приоритет над файлом заголовка системы. Мой лучший совет по этой проблеме - внимательно изучить, какие заголовочные файлы включены и откуда они идут.