Подтвердить что ты не робот

Ошибка компиляции: "stddef.h: нет такого файла или каталога"

Всякий раз, когда я пытаюсь скомпилировать этот код, он всегда заканчивается этой ошибкой:

    In file included from /usr/include/wchar.h:6:0,
             from /usr/lib/gcc/i686-pc-cygwin/4.9.2/include/c++/cwchar:44,
             from /usr/lib/gcc/i686-pc-cygwin/4.9.2/include/c++/bits/postypes.h:40,
             from /usr/lib/gcc/i686-pc-cygwin/4.9.2/include/c++/iosfwd:40,
             from /usr/lib/gcc/i686-pc-cygwin/4.9.2/include/c++/ios:38,
             from /usr/lib/gcc/i686-pc-cygwin/4.9.2/include/c++/ostream:38,
             from /usr/lib/gcc/i686-pc-cygwin/4.9.2/include/c++/iostream:39,
             from test.cpp:1:
    /usr/include/sys/reent.h:14:20: fatal error: stddef.h: No such file or directory
    #include <stddef.h>
                ^
    compilation terminated.

Код, который я пытался скомпилировать, это:

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello World! :D";
    return 0;
}
4b9b3361

Ответ 1

Ошибка заключается в том, что ваш пакет gcc-core и gcc-g++ не имеют одинаковой версии. Либо снимите одну из них, чтобы решить проблему, либо обновите обе библиотеки. Рекомендуется обновлять обе библиотеки.

Ответ 2

У меня была эта ошибка при новой установке MinGW, она не имела ничего общего с установленными пакетами, упомянутыми в текущем принятом ответе "Prasanth Karri". В моем случае проблема была вызвана -nostdinc в моем Makefile. На самом деле этот флаг компилятора мне был нужен только при сборке для другой целевой платформы (не при использовании MinGW), поэтому я исправил проблему, удалив этот флаг из сборок MinGW.

Ответ 3

Когда я включил библиотеку программного обеспечения, написанную на C, в существующий демонстрационный проект (использовала библиотеку С++ mbed), я столкнулся с этой проблемой. Демо-проект будет компилироваться просто отлично, но после того, как я заменил существующий основной файл самостоятельно, произошла эта ошибка.

В этот момент я еще не думал о том, что библиотека mbed, в которой я нуждалась, была написана на С++. Мой собственный основной файл был .c файлом, который #include mbed заголовочный файл. В результате я использовал свой обычный источник C, как если бы это был источник С++. Поэтому компилятором, который использовался для компиляции моего основного файла, был компилятор C. Затем этот компилятор C встретил #include модуля который на самом деле не существует (в пределах его области действия), поскольку он не является компилятором С++.

Только после того, как я проверил вывод журнала построения, я понял, что различные исходные файлы C и С++ были скомпилированы более чем одним компилятором (компилятором С++). В проекте использовались компиляторы arm-none-eabi-С++ и arm-none-eabi-gcc (для встроенных систем), как показано ниже.

Скомпилировать журнал:

Building file: ../anyfile.cpp
Invoking: MCU C++ Compiler
arm-none-eabi-c++ <A lot of arguments> "../anyfile.cpp"
Finished building: ../anyfile.cpp

Building file: ../main.c
Invoking: MCU C Compiler
arm-none-eabi-gcc <A lot of arguments> "../main.c"
In file included from <Project directory>\mbed/mbed.h:21:0,
                 from ../main.c:16:
<Project directory>\mbed/platform.h:25:19: fatal error: cstddef: No such file or directory
compilation terminated.

Конечно, в среде С++ cstddef существует, но в среде C cstddef не существует, вместо того, чтобы просто реализовать C stddef.

Другими словами, cstddef не существует в компиляторе C. Я решил эту проблему, переименовав файл main.c в main.cpp, а остальная часть кода тоже была скомпилирована.

TL;DR/Заключение. При создании проекта на С++ избегайте смешивания файлов C с файлами С++ (источники и заголовки). Если возможно, переименуйте файлы .c в файлы .cpp, чтобы использовать компилятор С++ вместо компилятора C, где это необходимо.

Ответ 4

Эта проблема была решена для меня, когда я установил codeblocks с компилятором mingw, затем скопировал папку mingw из кодовых блоков на диск C и добавил C\mingw\bin к переменным среды.