J'essaie de compiler un package logiciel C++ écrit en 2007 et j'obtiens cette erreur:
error: ‘uint32_t’ does not name a type
Cela se produit dans Ubuntu 64 bits en utilisant g ++ 4.5.2. Il compile bien sur CentOS 64 bits en utilisant g ++ 4.1.2.
Y'a-t-il un #include
ou un indicateur de compilateur qui me manque? Ou devrais-je utiliser typedef
pour affecter uint32_t
à un size_t
ou peut-être un unsigned int
?
Vous devez inclure stdint.h
#include <stdint.h>
Tu dois #include <cstdint>
, mais cela ne fonctionne pas toujours.
Le problème est que certains compilateurs exportent souvent automatiquement les noms définis dans divers en-têtes ou types fournis avant la mise en place de telles normes.
Maintenant, j'ai dit "peut ne pas toujours fonctionner." En effet, l'en-tête cstdint fait partie de la norme C++ 11 et n'est pas toujours disponible sur les compilateurs C++ actuels (mais l'est souvent). L'en-tête stdint.h est l'équivalent C et fait partie de C99.
Pour une meilleure portabilité, je vous recommande d'utiliser boost/cstdint.hpp
en-tête, si vous êtes prêt à utiliser boost. Sinon, vous pourrez probablement vous échapper avec # include'ing <cstdint>
.
J'ai également rencontré le même problème sur Mac OSX 10.6.8 et malheureusement en ajoutant #include <stdint.h>
ou <cstdint.h>
au fichier correspondant n'a pas résolu mon problème. Cependant, après plus de recherches, j'ai trouvé cette solution conseillant d'ajouter #include <sys/types.h>
qui a bien fonctionné pour moi!
Les autres réponses supposent que votre compilateur est conforme à C++ 11. C'est bien si c'est le cas. Mais que se passe-t-il si vous utilisez un compilateur plus ancien?
J'ai ramassé le hack suivant quelque part sur le net. Cela fonctionne assez bien pour moi:
#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
Ce n'est pas portable, bien sûr. Mais cela pourrait fonctionner pour votre compilateur.
Ajoutez ce qui suit dans le fichier base.mk. La 3ème ligne suivante est importante -include $(TOP)/defs.mk
CFLAGS=$(DEBUG) -Wall -W -Wwrite-strings
CFLAGS_C=-Wmissing-prototypes
CFLAGS_CXX=-std=c++0x
LDFLAGS=
LIBS=
pour éviter l'erreur # Ce fichier nécessite la prise en charge du compilateur et de la bibliothèque pour la prochaine norme ISO C++, C++ 0x. Cette prise en charge est actuellement expérimentale et doit être activée avec les options du compilateur -std = c ++ 0x ou -std = gnu ++ 0x
J'ai eu le même problème en essayant de compiler une bibliothèque que je télécharge sur Internet. Dans mon cas, il y avait déjà un #include <cstdint>
dans le code. Je l'ai résolu en ajoutant un:
using std::uint32_t;
si cela se produit lorsque vous incluez en-tête opencv.
Je recommanderais de changer l'ordre des en-têtes.
placez les en-têtes d'opencv juste en dessous de l'en-tête C++ standard.
comme ça:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>