webentwicklung-frage-antwort-db.com.de

GCC Linaro Compiler wirft Fehler "unbekannter Typname size_t"

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.

20
rashok

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.

39
Andrew Piroli

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.

5
yano

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?

0
Galaxy