Ich versuche, ein C++ - Softwarepaket zu kompilieren, das 2007 geschrieben wurde, und erhalte den folgenden Fehler:
error: ‘uint32_t’ does not name a type
Dies geschieht in 64-Bit-Ubuntu unter Verwendung von g ++ 4.5.2. Es kann unter 64-Bit-CentOS mit g ++ 4.1.2 problemlos kompiliert werden.
Gibt es ein #include
Oder ein Compiler-Flag, das mir fehlt? Oder sollte ich typedef
verwenden, um uint32_t
Einem size_t
Oder vielleicht einem unsigned int
Zuzuweisen?
Sie müssen stdint.h einschließen
#include <stdint.h>
Sie müssen #include <cstdint>
Eingeben, aber das funktioniert möglicherweise nicht immer.
Das Problem ist, dass einige Compiler Namen, die in verschiedenen Headern oder bereitgestellten Typen definiert wurden, oft automatisch exportieren, bevor solche Standards eingeführt wurden.
Jetzt sagte ich "funktioniert vielleicht nicht immer." Dies liegt daran, dass der cstdint-Header Teil des C++ 11-Standards ist und auf aktuellen C++ - Compilern nicht immer verfügbar ist (was jedoch häufig der Fall ist). Der Header stdint.h ist das C-Äquivalent und Teil von C99.
Für eine optimale Portabilität würde ich die Verwendung des Boost-Headers boost/cstdint.hpp
Empfehlen, wenn Sie Boost verwenden möchten. Andernfalls können Sie wahrscheinlich mit # include'ing <cstdint>
Durchkommen.
Ich habe das gleiche Problem auch unter Mac OS X 10.6.8 und leider beim Hinzufügen von #include <stdint.h>
oder <cstdint.h>
zur entsprechenden Datei hat mein Problem nicht gelöst. Nach mehr Suche fand ich diese Lösung jedoch empfehlenswert, #include <sys/types.h>
was für mich gut funktioniert hat!
Die anderen Antworten setzen voraus, dass Ihr Compiler C++ 11-kompatibel ist. Das ist in Ordnung, wenn es so ist. Aber was ist, wenn Sie einen älteren Compiler verwenden?
Ich habe den folgenden Hack irgendwo im Netz gefunden. Es funktioniert gut genug für mich:
#if defined __UINT32_MAX__ or UINT32_MAX
#include <inttypes.h>
#else
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
typedef unsigned long long uint64_t;
#endif
Es ist natürlich nicht portabel. Aber es könnte für Ihren Compiler funktionieren.
Fügen Sie der Datei base.mk Folgendes hinzu. Die folgende 3. Zeile ist wichtig -include $(TOP)/defs.mk
CFLAGS=$(DEBUG) -Wall -W -Wwrite-strings
CFLAGS_C=-Wmissing-prototypes
CFLAGS_CXX=-std=c++0x
LDFLAGS=
LIBS=
um den # Fehler zu vermeiden Diese Datei erfordert Compiler- und Bibliotheksunterstützung für den kommenden ISO C++ - Standard C++ 0x. Diese Unterstützung ist derzeit experimentell und muss mit den Compileroptionen -std = c ++ 0x oder -std = gnu ++ 0x aktiviert werden
Ich hatte das gleiche Problem beim Kompilieren einer Bibliothek, die ich aus dem Internet heruntergeladen habe. In meinem Fall gab es bereits ein #include <cstdint>
im Code. Ich habe es gelöst, indem ich Folgendes hinzugefügt habe:
using std::uint32_t;
wenn es passiert ist, wenn Sie opencv-Header enthalten.
Ich würde empfehlen, die Reihenfolge der Überschriften zu ändern.
setzen Sie die opencv-Header direkt unter den Standard-C++ - Header.
so was:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>