web-dev-qa-db-fra.com

Le compilateur GCC linaro renvoie l'erreur "nom de type inconnu size_t"

J'utilise GCC Linaro compilateur pour compiler mon code. Son jetant l'erreur unknown type name size_t de libio.h. Son inclus à partir de stdio.h. Dans mon code, j'inclus simplement stdio.h.

Quelqu'un peut-il s'il vous plaît comment résoudre cette erreur.

20
rashok

Selon C99, §7.17, size_t n'est pas un type intégré mais défini dans <stddef.h>.

Incluant le <stddef.h> l'en-tête devrait résoudre votre problème.

39
Andrew Piroli

Pour ce que ça vaut, j'ai eu exactement le même problème avec un projet QT, où j'utilisais un compilateur Linaro pour (sur Windows x86 et Linux x86) construire pour ARM Linux. Utiliser l'exact même code et fichier .pro, je n'ai eu aucun problème à construire sur Windows, mais j'ai eu une litanie d'erreurs à construire sur la boîte Linux, en commençant par unknown type name 'size_t' dans libio.h qui remonte à un #include <stdio.h>. J'ai regardé dans le stdio.h (Dans le sysroot pour le matériel cible, pas sur la machine hôte), et quelques lignes plus bas étaient #include <stddef.h> (Bien avant #include <libio.h>), Donc stddef.h Était définitivement inclus. Cependant, après une inspection plus approfondie, stddef.h Était complètement vide avec une taille de fichier de 1 octet. Cela était vrai pour stddef.h dans mon sysroot et sur ma machine hôte. Je ne sais pas pourquoi ces fichiers étaient vides.

Quoi qu'il en soit, il s'avère que j'avais un INCLUDEPATH += /usr/include/linux Superflu dans mon fichier .pro. Sur ma machine de compilation Linux, cela a ajouté -I/usr/include/linux Au Makefile généré par qmake. Sur ma machine de génération Windows, cela a ajouté -isystem /usr/include/linux Au Makefile généré par qmake. Une fois que j'ai commenté cela, ces lignes ont été supprimées des Makefiles et elles ont été intégrées aux deux machines de génération. -isystem /usr/include/linux N'a apparemment jamais causé de problème sur la machine de génération Windows, donc il n'y avait aucun mal à supprimer INCLUDEPATH += /usr/include/linux.

Je ne sais pas vraiment pourquoi cela a résolu mon problème, mais je pense qu'il s'agissait d'une sorte de conflit entre les fichiers d'en-tête. Il s'agissait peut-être de mélanger des fichiers d'en-tête Host avec des fichiers d'en-tête sysroot ou de créer une dépendance circulaire d'une manière ou d'une autre. La documentation de GCC indique que tout ce qui est inclus avec l'option -I Aura priorité sur un fichier d'en-tête système. Mon meilleur conseil pour ce problème est de regarder attentivement quels fichiers d'en-tête sont inclus et d'où ils proviennent.

5
yano

Tous les deux stdio.h et stdlib.h inclure le type de données size_t. Ils incluent ce type de données car les fonctions déclarées dans ces en-têtes prennent soit size_t comme paramètre ou le renvoyer comme type de retour. size_t lui-même est un typedef d'un type intégral non signé et il est également renvoyé par l'opérateur sizeof.

Et parce que l'opérateur sizeof est intégré au langage de programmation C lui-même, non inclus via une bibliothèque, alors comment size_t être un nom de type inconnu?

0
Galaxy