编译错误:“stddef.h:没有这样的文件或目录”

时间:2015-07-24 01:12:24

标签: c++ g++ cygwin

每当我尝试编译此代码时,它总是会出现此错误:

    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;
}

6 个答案:

答案 0 :(得分:60)

错误是因为您的gcc-core软件包和gcc-g ++的版本不同。要么降级其中一个以解决问题或更新两个库。建议更新两个库。

答案 1 :(得分:2)

我在一个新的MinGW安装上遇到了这个错误,它与当前接受的答案中提到的安装包没有任何关系,&#34; Prasanth Karri&#34;。在我的情况下问题是由&#34; -nostdinc&#34;在我的Makefile中。实际上,在构建不同的目标平台时(不是在使用MinGW时)我只需要那个编译器标志,所以我通过从MinGW构建中删除该标志来修复该问题。

答案 2 :(得分:2)

当我将用C编写的软件库合并到现有的演示项目(使用C ++ mbed库)时,我遇到了这个问题。演示项目编译得很好,但在我用自己的替换现有主文件后,发生了这个错误。

此时我还没有想到我需要的mbed库是用C ++编写的。我自己的主文件是。#include mbed头文件的.c文件。结果我使用了我的普通C源,就像它是一个C ++源代码一样。因此,用于编译主文件的编译器是 C编译器。 然后,这个C编译器遇到了#include模块that actually does not exist(在其范围内),因为它不是C ++编译器。

只有在我检查了构建日志的输出后,才意识到各种源C和C ++文件是由更多的1编译器(c ++编译器)编译的。该项目使用了编译器arm-none-eabi-c ++和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.

当然,在C ++环境cstddef exists中,但在C环境中,cstddef不存在,in stead it's just C's implementation of stddef

换句话说,C编译器中不存在cstddef。 我通过将main.c文件重命名为main.cpp解决了这个问题,其余代码也顺利编译。

TLDR /结论:构建C ++项目时,请避免将C文件与C ++文件(源和标头)混合。如果可能,将.c文件重命名为.cpp 文件,以便在需要时使用C ++编译器代替C编译器。

答案 3 :(得分:1)

如果您尝试编译并看到诸如“致命错误:stddef.h:无此类文件或目录”之类的消息,则该错误是因为您的gcc-core和gcc-g ++软件包的版本不同。重新运行Cygwin安装程序,并确保选择编号最高的gcc-core和gcc-g ++版本。

答案 4 :(得分:1)

为了进行更新,请按照以下说明进行操作。 如果您使用的是Windows,则只需在命令提示符或Powershell上运行它们

更新软件包列表:mingw-get update

更新软件包列表后,运行:mingw-get upgrade

来源:How to update GCC in MinGW on Windows?

答案 5 :(得分:-1)

当我使用mingw编译器安装codeblocks时为我解决了此问题,然后将mingw文件夹从代码块复制到C驱动器并添加了 C\mingw\bin到环境变量。