Ich benutze GCC Linaro Compiler zum Kompilieren meines Codes. Es wirft den Fehler unknown type name size_t
von libio.h
. Es ist enthalten von stdio.h
. In meinem Code füge ich nur stdio.h
.
Kann jemand bitte wie man diesen Fehler behebt.
Gemäß C99, §7.17, size_t
ist kein eingebauter Typ, sondern definiert in <stddef.h>
.
Einschließlich der <stddef.h>
Header sollte Ihr Problem beheben.
Für das, was es wert ist, hatte ich genau das gleiche Problem mit einem QT-Projekt, bei dem ich einen Linaro-Compiler verwendete, um (unter x86 Windows und x86 Linux) für ARM Linux. Mit dem genauen Gleicher Code und gleiche .pro-Datei, ich hatte keine Probleme beim Erstellen unter Windows, aber ich hatte eine Litanei von Fehlern beim Erstellen auf der Linux-Box, beginnend mit dem unknown type name 'size_t'
in libio.h
, der auf zurückgeht a #include <stdio.h>
. Ich habe im stdio.h
(in der Systemwurzel nach der Zielhardware, nicht auf dem Hostcomputer) gesucht und ein paar Zeilen weiter unten war #include <stddef.h>
( viel vor #include <libio.h>
), also wurde stddef.h
definitiv aufgenommen, jedoch war stddef.h
bei weiterer Überprüfung mit einer Dateigröße von 1 Byte vollständig leer true für stddef.h
in meinem sysroot und auf meinem Host-Rechner. Ich habe keine Ahnung, warum diese Dateien leer waren.
Wie auch immer, es stellte sich heraus, dass in meiner .pro-Datei ein anderer INCLUDEPATH += /usr/include/linux
enthalten war. Auf meiner Linux-Build-Maschine fügte dies dem von qmake generierten Makefile -I/usr/include/linux
hinzu. Auf meinem Windows-Buildcomputer wurde dem von qmake generierten Makefile -isystem /usr/include/linux
hinzugefügt. Nachdem ich dies auskommentiert hatte, wurden diese Zeilen aus den Makefiles entfernt und es wurde direkt auf beiden Build-Maschinen aufgebaut. -isystem /usr/include/linux
hat anscheinend nie Probleme auf dem Windows-Build-Rechner verursacht, sodass das Entfernen von INCLUDEPATH += /usr/include/linux
keinen Schaden angerichtet hat.
Ich weiß nicht genau, warum dies mein Problem behoben hat, aber ich vermute, dass es sich um einen Konflikt zwischen Header-Dateien handelte. Vielleicht war es das Mischen von Host-Header-Dateien mit Sysroot-Header-Dateien oder das Erzeugen einer kreisförmigen Abhängigkeit. Die GCC-Dokumentation besagt, dass alles, was in der Option -I
enthalten ist, Vorrang vor einer System-Header-Datei hat. Mein bester Rat für dieses Problem ist, sich genau anzusehen, welche Header-Dateien enthalten sind und woher sie stammen.
Beide stdio.h
und stdlib.h
enthält den Datentyp size_t
. Sie enthalten diesen Datentyp, da die in diesen Headern deklarierten Funktionen entweder size_t
als Parameter oder als Rückgabetyp. size_t
selbst ist ein typedef
für einen vorzeichenlosen ganzzahligen Typ und wird auch vom Operator sizeof
zurückgegeben.
Und da der Operator sizeof
in die C-Programmiersprache selbst integriert ist und nicht über eine Bibliothek bereitgestellt wird, wie kann size_t
ein unbekannter Typname sein?