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
をsize_t
またはunsigned int
に割り当てる必要がありますか?
Stdint.hを含める必要があります
#include <stdint.h>
#include <cstdint>
が必要ですが、それが常に機能するとは限りません。
問題は、さまざまなヘッダーで定義された名前または提供されたタイプが、そのような標準が導入される前に、一部のコンパイラがしばしば自動的にエクスポートすることです。
今、私は「いつもうまくいくとは限らない」と言った。これは、cstdintヘッダーがC++ 11標準の一部であり、現在のC++コンパイラで常に使用できるとは限らないためです(多くの場合使用可能です)。 stdint.hヘッダーはCに相当し、C99の一部です。
最適な移植性を得るために、Boostを使用する場合は、Boostのboost/cstdint.hpp
ヘッダーを使用することをお勧めします。そうでなければ、おそらく#include'ing <cstdint>
で逃げることができるでしょう。
Mac OSX 10.6.8でも同じ問題が発生しましたが、残念ながら#include <stdint.h>
または<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
もちろん、ポータブルではありません。しかし、それはあなたのコンパイラのために働くかもしれません。
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コンパイラオプションで有効にする必要があります
インターネットからダウンロードしたライブラリをコンパイルしようとすると、同じ問題が発生しました。私の場合、コードにはすでに#include <cstdint>
がありました。私はそれを解決して:
using std::uint32_t;
opencvヘッダーをインクルードしたときに発生した場合。
ヘッダーの順序を変更することをお勧めします。
opencvヘッダーを標準C++ヘッダーのすぐ下に配置します。
このような:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>