我正在尝试编译 2007 年编写的 C++ 软件包,但出现此错误:
error: ‘uint32_t’ does not name a type
这发生在使用 g++ 4.5.2 的 64 位 Ubuntu 中。它使用 g++ 4.1.2 在 64 位 CentOS 上编译良好。
#include
我缺少一个或一个编译器标志吗?或者,我应该使用typedef
分配uint32_t
给 asize_t
还是 a unsigned int
?
您需要包括 stdint.h
#include <stdint.h>
您需要#include <cstdint>
,但这可能并不总是有效。
问题在于,某些编译器通常会在此类标准到位之前自动导出各种标头中定义的名称或提供的类型。
现在,我说“可能并不总是有效”。这是因为 cstdint 标头是 C++11 标准的一部分,并且在当前的 C++ 编译器上并不总是可用(但通常是)。stdint.h 头文件是 C 等价的,是 C99 的一部分。
boost/cstdint.hpp
为了获得最佳可移植性,如果您愿意使用 boost ,我建议您使用 Boost 的标头。否则,您可能能够摆脱 #include'ing <cstdint>
。
我在 Mac OSX 10.6.8 上也遇到了同样的问题,不幸的是,将#include <stdint.h>
or添加<cstdint.h>
到相应的文件并没有解决我的问题。但是,经过更多搜索,我发现这个解决方案建议添加#include <sys/types.h>
对我来说效果很好!
其他答案假设您的编译器符合 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
当然,它不是便携式的。但它可能适用于您的编译器。
如果它在您包含 opencv 标头时发生。
我建议更改标题的顺序。
将 opencv 头文件放在标准 C++ 头文件的下方。
像这样:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
在 base.mk 文件中添加以下内容。以下第 3 行很重要
-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 编译器选项启用
我在尝试编译从 Internet 下载的库时遇到了同样的问题。就我而言,代码中已经有一个#include <cstdint>
。我解决了它添加一个:
using std::uint32_t;
只需导航到 /usr/include/x86_64-linux-gnu/bits 打开 stdint-uintn.h 并添加这些行
typedef __uint8_t uint8_t;
typedef __uint16_t uint16_t;
typedef __uint32_t uint32_t;
typedef __uint64_t uint64_t;
再次打开 stdint-intn.h 并添加
typedef __int8_t int8_t;
typedef __int16_t int16_t;
typedef __int32_t int32_t;
typedef __int64_t int64_t;
请注意,这些行已经存在,只需复制并添加缺少的行欢呼..
您需要包括 iostream
#include <iostream>
using namespace std;