web-dev-qa-db-fra.com

Erreur de compilation: "stddef.h: Aucun fichier ou répertoire de ce type"

Chaque fois que j'essaie de compiler ce code, il se termine toujours avec cette erreur:

    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.

Le code que j'essayais de compiler est le suivant:

#include <iostream>
using namespace std;

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

L'erreur est due au fait que votre paquet gcc-core et votre gcc-g ++ n'ont pas la même version. Vous pouvez soit déclasser l’une d’elles pour résoudre le problème, soit mettre à jour les deux bibliothèques. La mise à jour des deux bibliothèques est la méthode recommandée.

60
ThisIzKp

J'ai eu cette erreur sur une nouvelle installation de MinGW, cela n’a rien à voir avec les paquets installés mentionnés dans la réponse acceptée actuelle de "Prasanth Karri". Dans mon cas le problème a été causé par -nostdinc dans mon Makefile. En fait, je n'avais besoin que de cet indicateur de compilation lors de la génération pour une plate-forme cible différente (pas lors de l'utilisation de MinGW); j'ai donc résolu le problème en supprimant cet indicateur des générations MinGW.

3
Ben

Lorsque j'intégrais une bibliothèque de logiciels écrite en C dans un projet de démonstration existant (dans une bibliothèque m ++ C++), j'ai rencontré ce problème. Le projet de démonstration compilerait parfaitement, mais après avoir remplacé le fichier principal existant par le mien, cette erreur s’est produite.

À ce stade, je n'avais pas encore pensé au fait que la bibliothèque mbed dont j'avais besoin était écrite en C++. Mon propre fichier principal était un fichier .c qui #include le fichier d’en-tête mbed. En conséquence, j'ai utilisé ma source C normale comme s'il s'agissait d'une source C++. Par conséquent, le compilateur utilisé pour compiler mon fichier principal était le compilateur C. Ce compilateur C a ensuite rencontré un #include d'un module qui n'existe pas en réalité (dans sa portée), car ce n'est pas un compilateur C++.

Ce n’est qu’après avoir inspecté la sortie du journal de construction que j’ai réalisé que les divers fichiers source C et C++ étaient compilés par plus d’un compilateur (le compilateur c ++). Le projet a utilisé des compilateurs arm-none-eabi-c ++ et arm-none-eabi-gcc (pour les systèmes intégrés), comme indiqué ci-dessous.

Journal de compilation:

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.

Bien sûr, dans un environnement C++ cstddef existe , mais dans un environnement C, cstddef n'existe pas, à la place c'est juste l'implémentation de stddef par C .

En d'autres termes, cstddef n'existe pas dans le compilateur C. J'ai résolu ce problème en renommant mon fichier main.c en main.cpp et le reste du code compilé en douceur également.

TLDR/Conclusion : lors de la construction d'un projet C++, évitez de mélanger des fichiers C avec des fichiers C++ (sources et en-têtes). Si possible , renommez les fichiers .c en fichiers .cpp pour utiliser le compilateur C++ à la place du compilateur C, le cas échéant.

2
Gilrain