Ответ 1
Вам нужно включить stdint.h
#include <stdint.h>
Я пытаюсь скомпилировать программный пакет С++, который был написан в 2007 году, и я получаю эту ошибку:
error: ‘uint32_t’ does not name a type
Это происходит в 64-битном Ubuntu, используя g++ 4.5.2. Он отлично компилируется в 64-битном CentOS, используя g++ 4.1.2.
Есть ли #include
или флаг компилятора, который мне не хватает? Или, следует ли использовать typedef
для назначения uint32_t
size_t
или, возможно, unsigned int
?
Вам нужно включить stdint.h
#include <stdint.h>
Вам нужно #include <cstdint>
, но это может не всегда работать.
Проблема заключается в том, что некоторые компиляторы часто автоматически экспортируют имена, определенные в разных заголовках или предоставленных типах, до того, как такие стандарты были на месте.
Теперь я сказал, что "может не всегда работать". Это потому, что заголовок cstdint является частью стандарта С++ 11 и не всегда доступен для текущих компиляторов С++ (но часто это бывает). Заголовок stdint.h является эквивалентом C и является частью C99.
Для лучшей переносимости я бы рекомендовал использовать заголовок Boost boost/cstdint.hpp
, если вы хотите использовать boost. В противном случае вы, вероятно, сможете уйти С# include'ing <cstdint>
.
Я также столкнулся с той же проблемой в Mac OSX 10.6.8 и, к сожалению, добавив #include <stdint.h>
или <cstdint.h>
в соответствующий файл, я не решил свою проблему. Однако после большего поиска я нашел это решение, предлагающее добавить #include <sys/types.h>
, который хорошо работал у меня!
Другие ответы предполагают, что ваш компилятор совместим с С++ 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 С++, С++ 0x. Эта поддержка в настоящее время является экспериментальной и должна быть включена с параметрами -std = С++ 0x или -std = gnu ++ 0x
если это произошло, когда вы включаете заголовок opencv.
Я бы рекомендовал изменить порядок заголовков.
поместите заголовки opencv чуть ниже стандартного заголовка С++.
вот так:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
У меня была та же проблема, которая пыталась скомпилировать lib, загружаемую из Интернета. В моем случае в коде уже был #include <cstdint>
. Я решил, что добавил:
using std::uint32_t;
Добавьте в файл base.mk следующее. Следующая 3-я строка важна - включите $(TOP)/defs.mk
CXXFLAGS = -g -std=c++11 -O3 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long $(THREADSCXXFLAGS)
просто перейдите в /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;