2012-06-17 8 views
48

Estoy intentando compilar un paquete de software en C++ que fue escrito en 2007 y que estoy recibiendo este error:'uint32_t' no nombra a un tipo

error: ‘uint32_t’ does not name a type

Esto está ocurriendo en 64 bits Ubuntu usando g ++ 4.5.2. Compila bien en CentOS de 64 bits utilizando g ++ 4.1.2.

¿Hay un #include o una bandera del compilador que me falta? ¿O debería usar typedef para asignar uint32_t a size_t o quizás unsigned int?

+5

Busque stdint.h o cabeceras. Ese tipo es (como yo lo entiendo) parte de C99 pero no lo hizo en C++. –

+3

¿'' incluyó '? Parece un posible error en Ubuntu de 64 bits. Además, ¿tiene un '-std = C++ 98' o alguna opción de línea de comando para gcc? Si es así, ¿puedes verificar si compila bien si usas '-std = gnu ++ 98'? – dirkgently

+0

@dirkgently Revisé el archivo Makefile y no había opciones 'std'. – rmtheis

Respuesta

102

Es necesario incluir stdint.h

#include <stdint.h> 
+36

El encabezado C++ "adecuado" sería 'cstdint'. – paxdiablo

+0

Nota, en mi caso, el problema era que el' 'boost/cstdint.hpp' no se encontró.' yum install boost-devel' arregló mi caso. – snooze92

+0

@paxdiablo no debería incluirse cstdint.h dentro de un bloque externo "C" {}? – StarShine

27

Necesita #include <cstdint>, pero eso no siempre funciona.

El problema es que algunos compiladores a menudo exportan automáticamente nombres definidos en varios encabezados o tipos proporcionados antes de que dichos estándares estuvieran en su lugar.

Ahora, dije "puede que no siempre funcione". Eso es porque el encabezado cstdint es parte del estándar C++ 11 y no siempre está disponible en los compiladores actuales de C++ (pero a menudo lo es). El encabezado stdint.h es el equivalente en C y es parte de C99.

Para una mejor portabilidad, recomiendo usar el encabezado boost/cstdint.hpp de Boost, si está dispuesto a usar boost. De lo contrario, probablemente podrá salirse con #including'ing <cstdint>.

+0

Esto me dio '#error Este archivo requiere el compilador y el soporte de la biblioteca para el próximo estándar ISO C++, C++ 0x. Este soporte es actualmente experimental y debe habilitarse con las opciones de compilador -std = C++ 0x o -std = gnu ++ 0x. – rmtheis

+1

Correcto, como se dice, cstdint es parte del nuevo estándar C++ (que se llamó C++ 0x pero no es, oficialmente, C++ 11. Entonces, para usar ese encabezado, debe habilitar el nuevo estándar en g ++. Como dije, la mejor manera portátil de obtener estos tipos es usar Boost o algún otro equivalente, en lugar de confiar en el soporte del compilador. – plasma

4

Las otras respuestas asumen que su compilador de C++ es compatible con 11. Eso está bien si lo es. Pero, ¿y si estás usando un compilador anterior?

Recogí el siguiente truco en algún lugar de la red. Funciona lo suficientemente bien para mí:

#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 

No es portátil, por supuesto. Pero podría funcionar para tu compilador.

1

Agregue lo siguiente en el archivo base.mk. La siguiente 3ª línea es importante -include $(TOP)/defs.mk

CFLAGS=$(DEBUG) -Wall -W -Wwrite-strings 
CFLAGS_C=-Wmissing-prototypes 
CFLAGS_CXX=-std=c++0x 
LDFLAGS= 
LIBS= 

para evitar la #error Este archivo requiere el apoyo y la biblioteca del compilador para la próxima norma ISO C++, C++ 0x. Este soporte es actualmente experimental, y debe ser habilitado con las opciones de compilador -std = C++ 0x o -std = gnu ++ 0x

+0

La pregunta no dice si se está utilizando Make. Una respuesta más portátil solo diría qué banderas pasan al compilador (y qué compilador eres ssuming). –

8

También encontré el mismo problema en Mac OSX 10.6.8 y lamentablemente agregué #include <stdint.h> o <cstdint.h> en el archivo correspondiente no resolvió mi problema. Sin embargo, después de más búsqueda, encontré esta solución asesorando para agregar #include <sys/types.h> que funcionó bien para mí.

1

si sucedió cuando se incluye el encabezado opencv.

Recomendaría cambiar el orden de los encabezados.

ponga los encabezados de opencv justo debajo del encabezado estándar de C++.

así:

#include<iostream> 
#include<opencv2/core/core.hpp> 
#include<opencv2/highgui/highgui.hpp> 
1

tuve tha mismo problema tratando de compilar una lib que se descargan de Internet. En mi caso, ya había un #include <cstdint> en el código. Lo resolví agregando un:

using std::uint32_t; 
+0

@Daniel Aún debe '' incluir' el encabezado correcto antes de poder acceder al tipo. – cubrr

+0

Sí, se necesita el '# include'. No dije que no es así. Pero como en mi caso era un '#include ', y no había 'using namespace std', el compilador no pudo resolver el nombre' uint32_t'. Esa es la razón por la que tuve que agregar 'using std :: uint32_t;' – Daniel

0

Agregue lo siguiente en el archivo base.mk. La siguiente línea 3 es importantes -include $ (TOP) /defs.mk

CXXFLAGS = -g -std=c++11 -O3 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long $(THREADSCXXFLAGS) 
Cuestiones relacionadas