2012-06-17 67 views
48

我试图编译写于2007年的C++软件包,我得到这个错误:“uint32_t的”没有指定类型

error: ‘uint32_t’ does not name a type

这是发生在64位Ubuntu使用g ++ 4.5.2。它使用g ++ 4.1.2在64位CentOS上编译得很好。

是否有#include或我缺少的编译器标志?或者,我是否应该使用typedefuint32_t分配给size_t或者unsigned int

+5

查找stdint.h或标题。该类型(据我了解)是C99的一部分,但没有成为C++。 –

+3

你有没有'#include '?看起来像是64位Ubuntu上的一个可能的错误。另外,你有'-std = C++ 98'或者一些gcc的命令行选项吗?如果是这样,你可以检查一下,如果你使用'-std = gnu ++ 98',它是否编译得很好? – dirkgently

+0

@dirkgently我检查了Makefile,没有'std'选项。 – rmtheis

回答

102

您需要包括stdint.h

#include <stdint.h> 
+36

“正确的”C++头文件是'cstdint'。 – paxdiablo

+0

请注意,在我的情况下,问题实际上是包含'boost/cstdint.hpp'没有找到。 boost-devel'修复了我的情况 – snooze92

+0

@paxdiablo不应该将cstdint.h包含在extern“C”{}块内? – StarShine

27

您需要#include <cstdint>,但这可能无法正常工作。

问题是某些编译器通常会自动导出在各种标题或提供的类型中定义的名称,然后才能实现这些标准。

现在,我说“可能不总是工作。”这是因为cstdint标头是C++ 11标准的一部分,并不总是在当前的C++编译器上可用(但通常是)。 stdint.h头文件是C等价物,并且是C99的一部分。

为了获得最佳可移植性,我建议使用Boost的boost/cstdint.hpp标题,如果您愿意使用boost。否则,你可能会逃脱#include'<cstdint>

+0

这给了我'#error这个文件需要编译器和库支持即将到来的ISO C++标准,C++ 0x。此支持目前是实验性的,必须使用-std = C++ 0x或-std = gnu ++ 0x编译器选项启用。' – rmtheis

+1

正如它所说的,cstdint是新的C++标准的一部分C++ 0x但不是正式的C++ 11.所以要使用这个头文件,你必须在g ++中启用新的标准。就像我说的,获得这些类型的最好的便携方法是使用Boost或其他的等价的头文件,而不是依靠编译器的支持 – plasma

4

其他的答案假设你的编译器是C++ 11标准。如果是的话,那很好。但是如果您使用的是较旧的编译器呢?

我拿起以下黑客在网上的某处。它适用于我:

#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 

当然,它不是便携式的。但它可能适用于您的编译器。

1

在base.mk文件中添加以下内容。下面第三行是重要的 -include $(TOP)/defs.mk

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

避免#ERROR此文件需要为即将到来的ISO C++标准C++ 0x中的编译器和库支持。此支持目前是实验性的,必须使用-std = C++ 0x或-std = gnu ++ 0x编译器选项启用

+0

这个问题并没有说明Make是否被使用,更简单的答案只是说哪些标志传递给编译器(以及你是哪个编译器) ssuming)。 –

8

我在Mac OSX 10.6.8上也遇到了同样的问题,并且不幸地添加了#include <stdint.h><cstdint.h>到相应的文件没有解决我的问题。但是,经过更多的搜索,我发现这个解决方案通知添加#include <sys/types.h>这对我来说效果很好!

1

如果它发生在包含opencv头文件时。

我会建议改变标题的顺序。

将opencv标题放在标准C++标题的下方。

这样的:

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

我不得不尝试编译一个lib我从互联网上下载塔同样的问题。就我而言,代码中已经有一个#include <cstdint>。我解决了它添加:

using std::uint32_t; 
+0

@Daniel在访问该类型之前,仍然需要“#include”正确的标题。 – cubrr

+0

是的,'#include'是必需的。我没有说它不是。但是因为在我的情况下它是'#include ',并且没有'使用命名空间std',编译器无法解析名称'uint32_t'。所以这就是我不得不添加'使用std :: uint32_t;'的原因 – Daniel

0

在base.mk文件中添加以下内容。以下第三行非常重要 - 包括$(TOP)/defs.mk

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