2012-06-17 45 views
48

Tôi đang cố gắng để biên dịch một gói C++ phần mềm được viết vào năm 2007 và tôi nhận được lỗi này:'uint32_t' không tên một loại

error: ‘uint32_t’ does not name a type

này đang xảy ra tại 64-bit Ubuntu sử dụng g ++ 4.5.2. Nó biên dịch tốt trên CentOS 64 bit bằng g ++ 4.1.2.

Có một số #include hoặc cờ trình biên dịch mà tôi đang thiếu không? Hoặc, tôi có nên sử dụng typedef để chỉ định uint32_t cho một size_t hoặc có thể là unsigned int?

+5

Tìm tiêu đề stdint.h hoặc . Đó là loại (như tôi hiểu nó) một phần của C99 nhưng không làm cho nó thành C + +. –

+3

Bạn có '#include '? Có vẻ như một lỗi có thể xảy ra trên Ubuntu 64 bit. Ngoài ra, bạn có một '-std = C++ 98' hoặc một số tùy chọn dòng lệnh như vậy cho gcc? Nếu vậy, bạn có thể kiểm tra nếu nó biên dịch tốt nếu bạn sử dụng '-std = gnu ++ 98'? – dirkgently

+0

@dirkgently Tôi đã kiểm tra Makefile và không có tùy chọn 'std'. – rmtheis

Trả lời

102

Bạn cần phải bao gồm stdint.h

#include <stdint.h> 
+36

Tiêu đề C++ "đúng" sẽ là 'cstdint'. – paxdiablo

+0

Lưu ý, trong trường hợp của tôi, vấn đề thực sự là không tìm thấy' boost/cstdint.hpp'. 'yum install boost-devel' cố định trường hợp của tôi – snooze92

+0

@paxdiablo không nên cstdint.h được bao gồm bên trong một khối "C" {} bên ngoài? – StarShine

27

Bạn cần phải #include <cstdint>, nhưng điều đó có thể không phải lúc nào cũng hoạt động.

Vấn đề là một số trình biên dịch thường tự động xuất tên được xác định trong các tiêu đề khác nhau hoặc các loại được cung cấp trước khi các tiêu chuẩn đó được đặt ra.

Bây giờ, tôi đã nói "có thể không phải lúc nào cũng hoạt động". Đó là vì tiêu đề cstdint là một phần của tiêu chuẩn C++ 11 và không phải lúc nào cũng có sẵn trên các trình biên dịch C++ hiện tại (nhưng thường là). Tiêu đề stdint.h tương đương với C và là một phần của C99.

Để có tính di động tốt nhất, tôi khuyên bạn nên sử dụng tiêu đề của Boost's boost/cstdint.hpp, nếu bạn sẵn sàng sử dụng tăng. Nếu không, có thể bạn sẽ có thể thoát khỏi # include'ing <cstdint>.

+0

Điều này đã cho tôi '#error Tệp này yêu cầu hỗ trợ trình biên dịch và thư viện cho tiêu chuẩn ISO C++ sắp tới, C++ 0x. Hỗ trợ này hiện đang được thử nghiệm, và phải được kích hoạt với các tùy chọn trình biên dịch -std = C++ 0x hoặc -std = gnu ++ 0x.' – rmtheis

+1

Phải, như nó nói, cstdint là một phần của tiêu chuẩn C++ mới (được gọi là C++ 0x nhưng không chính thức, C++ 11. Vì vậy, để sử dụng tiêu đề đó, bạn phải kích hoạt tiêu chuẩn mới trong g ++. Như tôi đã nói, cách di động tốt nhất để có được những loại này là sử dụng Boost hoặc một số khác – plasma

4

Những câu trả lời khác cho rằng trình biên dịch của bạn là C++ 11 tuân thủ. Đó là tốt nếu nó được. Nhưng nếu bạn đang sử dụng một trình biên dịch cũ hơn thì sao?

Tôi đã chọn một đoạn mã sau đây trên mạng. Nó hoạt động tốt đủ cho tôi:

#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 

Nó không phải là di động, tất nhiên. Nhưng nó có thể làm việc cho trình biên dịch của bạn.

1

Thêm phần sau vào tệp base.mk. Dòng thứ 3 sau đây là quan trọng -include $(TOP)/defs.mk

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

để tránh #error Tập tin này đòi hỏi phải có trình biên dịch và thư viện hỗ trợ cho các tiêu chuẩn sắp tới ISO C++, C++ 0x. Hỗ trợ này hiện đang được thử nghiệm và phải được bật với tùy chọn trình biên dịch -std = C++ 0x hoặc -std = gnu ++ 0x

+0

Câu hỏi không cho biết liệu Make có đang được sử dụng hay không. cờ nào chuyển tới trình biên dịch (và trình biên dịch nào bạn là ssuming). –

8

Tôi cũng gặp sự cố tương tự trên Mac OSX 10.6.8 và không may thêm #include <stdint.h> hoặc <cstdint.h> vào tệp tương ứng không giải quyết được sự cố của tôi. Tuy nhiên, sau khi tìm kiếm thêm, tôi tìm thấy giải pháp này để thêm #include <sys/types.h> hoạt động tốt cho tôi!

1

nếu điều đó xảy ra khi bạn bao gồm tiêu đề opencv.

Tôi khuyên bạn nên thay đổi thứ tự của tiêu đề.

đặt tiêu đề opencv ngay bên dưới tiêu đề C++ chuẩn.

như thế này:

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

tôi đã tha cùng một vấn đề cố gắng để biên dịch một lib tôi tải về từ internet. Trong trường hợp của tôi, đã có #include <cstdint> trong mã. Tôi đã giải quyết thêm một:

using std::uint32_t; 
+0

@Daniel Bạn vẫn cần '# include' tiêu đề chính xác trước khi bạn có thể truy cập loại. – cubrr

+0

Có, '# include' là cần thiết. Tôi không nói là không. Nhưng vì trong trường hợp của tôi nó là '#include ', và không có 'sử dụng không gian tên std', trình biên dịch không thể giải quyết tên' uint32_t'. Vì vậy, đó là lý do tôi phải thêm 'using std :: uint32_t;' – Daniel

0

Thêm phần sau vào tệp base.mk. Dòng thứ 3 sau là quan trọng - bao gồm $ (TOP) /defs.mk

CXXFLAGS = -g -std=c++11 -O3 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long $(THREADSCXXFLAGS) 
Các vấn đề liên quan