web-dev-qa-db-ja.com

コンパイルエラー:「stddef.h:No such file or directory」

このコードをコンパイルしようとすると、常にこのエラーが発生します。

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

エラーは、gcc-coreパッケージとgcc-g ++が同じバージョンではないためです。どちらかをダウングレードして問題を解決するか、両方のライブラリを更新します。両方のライブラリを更新することをお勧めします。

60
ThisIzKp

MinGWの新規インストールでこのエラーが発生しました。「Prasanth Karri」による現在受け入れられている回答で言及されているインストール済みパッケージとは関係ありません。私の場合問題は-nostdinc私のMakefileで。実際には、MinGWの使用時ではなく、異なるターゲットプラットフォーム用にビルドするときにのみコンパイラフラグが必要だったため、MinGWビルドからそのフラグを削除することで問題を修正しました。

3
Ben

Cで記述されたソフトウェアライブラリを既存のデモプロジェクト(C++ mbedライブラリを使用)に組み込むと、この問題が発生しました。デモプロジェクトは問題なくコンパイルされますが、既存のメインファイルを自分で置き換えた後、このエラーが発生しました。

この時点では、必要なmbedライブラリがC++で書かれているという事実についてはまだ考えていませんでした。私自身のメインファイルは、#include mbedヘッダーファイルである.cファイルでした。その結果、通常のCソースをC++ソースのように使用しました。したがって、メインファイルのコンパイルに使用されたコンパイラはCコンパイラでした。このCコンパイラは、C++コンパイラではないため、モジュールの#include実際には存在しない (スコープ内)に遭遇しました。

ビルドログの出力を調べた後にのみ、さまざまなソースCおよびC++ファイルが複数のコンパイラ(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が存在する ですが、C環境ではcstddefは存在しません 代わりにCのstddefの実装です

つまり、CstddefはCコンパイラに存在しません。 main.cファイルの名前をmain.cppに変更し、残りのコードもスムーズにコンパイルすることで、この問題を解決しました。

TLDR/Conclusion:C++プロジェクトをビルドするときは、CファイルとC++ファイル(ソースおよびヘッダー)を混在させないでください。可能であれば.cファイルの名前を.cppファイルに変更して、必要に応じてCコンパイラーの代わりにC++コンパイラーを使用します。

2
Gilrain