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.
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.
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.
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?