2012-06-17 11 views
48

próbuję skompilować C++ pakiet oprogramowania, który został napisany w 2007 roku, a ja dostaję ten błąd:„uint32_t” nie nazwać typ

error: ‘uint32_t’ does not name a type

Dzieje się to w 64-bitowy Ubuntu za pomocą g ++ 4.5.2. Kompiluje się dobrze na 64-bitowym CentOS przy użyciu g ++ 4.1.2.

Czy brakuje mi #include lub flagi kompilatora? Lub, czy powinienem użyć typedef, aby przypisać uint32_t do size_t lub może unsigned int?

+5

Szukaj nagłówków stdint.h lub . Ten typ jest (jak rozumiem) częścią C99, ale nie stał się C++. –

+3

Czy "#include "? Wygląda jak możliwy błąd na 64-bitowym systemie Ubuntu. Czy masz również opcję '-std = C++ 98' lub jakąś taką opcję wiersza poleceń dla gcc? Jeśli tak, czy możesz sprawdzić, czy kompiluje się dobrze, jeśli używasz '-std = gnu ++ 98'? – dirkgently

+0

@ dirkgently Sprawdziłem Makefile i nie było opcji 'std'. – rmtheis

Odpowiedz

102

Trzeba to stdint.h

#include <stdint.h> 
+36

"Właściwym" nagłówkiem C++ będzie "cstdint". – paxdiablo

+0

Uwaga, w moim przypadku problem polegał na tym, że nie znaleziono elementu 'boost/cstdint.hpp'. boost-devel' naprawił moją obudowę – snooze92

+0

@paxdiablo nie powinien być dołączony do cstdint.h wewnątrz zewnętrznego bloku "C" {}? – StarShine

27

Musisz #include <cstdint>, ale to nie zawsze działa.

Problem polega na tym, że niektóre kompilatory często automatycznie eksportują nazwy zdefiniowane w różnych nagłówkach lub dostarczonych typach, zanim takie standardy zostały wprowadzone.

Powiedziałem: "nie zawsze działa." To dlatego, że nagłówek cstdint jest częścią standardu C++ 11 i nie zawsze jest dostępny w obecnych kompilatorach C++ (ale często jest). Nagłówek stdint.h jest odpowiednikiem C i jest częścią C99.

Aby uzyskać najlepszą przenośność, polecam użycie nagłówka Boost w postaci boost/cstdint.hpp, jeśli chcesz użyć boost. W przeciwnym razie prawdopodobnie będziesz mógł ucieC# include'ing <cstdint>.

+0

To dało mi '#error Ten plik wymaga obsługi kompilatora i biblioteki dla nadchodzącego standardu ISO C++, C++ 0x. Ta obsługa jest obecnie eksperymentalna i musi być włączona przy opcjach kompilatora -std = C++ 0x lub -std = gnu ++ 0x. " – rmtheis

+1

Tak, jak napisano, cstdint jest częścią nowego standardu C++ (który został nazwany C++ 0x, ale oficjalnie nie jest to C++ 11. Aby użyć tego nagłówka, musisz włączyć nowy standard w g ++. Tak jak powiedziałem, najlepszym przenośnym sposobem na uzyskanie tego typu jest użycie Boost lub innego równoważny nagłówek, zamiast polegać na obsłudze kompilatora – plasma

4

innych odpowiedzi przypuszczać, że kompilator C++ 11 zgodny. W porządku, jeśli tak jest. Ale co, jeśli używasz starszego kompilatora?

Podniosłem następujący hack gdzieś w sieci. Działa to wystarczająco dobrze:

#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 

Oczywiście nie jest przenośny. Ale może działać dla twojego kompilatora.

1

Dodaj następujące elementy w pliku base.mk. Poniższy 3. linia jest ważna -include $(TOP)/defs.mk

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

uniknąć #Error Ten plik wymaga kompilatora i bibliotek wsparcie dla nadchodzącego standardu ISO C++, C++ 0x. Ta obsługa jest obecnie eksperymentalna i musi być włączona przy opcjach kompilatora -std = C++ 0x lub -std = gnu ++ 0x.

+0

Pytanie nie mówi, czy jest używany Make. które flagi przekazują do kompilatora (i który kompilator jesteś ssuming). –

8

Napotkano ten sam problem na Mac OSX 10.6.8 i niestety dodając #include <stdint.h> lub <cstdint.h> do odpowiedniego pliku nie rozwiąże mojego problemu. Jednak po dalszych poszukiwaniach znalazłem to rozwiązanie, które zalecało dodanie funkcji #include <sys/types.h>, która działała dobrze dla mnie!

1

jeśli tak się stało, gdy dodasz nagłówek opencv.

Polecam, aby zmienić kolejność nagłówków.

umieścić nagłówki opencv tuż poniżej standardowego nagłówka C++.

tak:

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

miałem tha sam problem próbuje skompilować lib pobrać z Internetu. W moim przypadku w kodzie było już #include <cstdint>. Rozwiązałem to dodając:

using std::uint32_t; 
+0

@Daniel Nadal musisz '# include' poprawny nagłówek, zanim uzyskasz dostęp do typu. – cubrr

+0

Tak, potrzebne jest '# include'. Nie powiedziałem, że nie jest. Ale ponieważ w moim przypadku było to '#include ' i nie było 'using namespace std', kompilator nie był w stanie rozwiązać nazwy' uint32_t'. Dlatego właśnie musiałem dodać 'using std :: uint32_t;' – Daniel

0

Dodaj poniższe w pliku base.mk. Ważna jest następująca trzecia linia - w tym $ (TOP) /defs.mk

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