2010-03-25 36 views
15

Tôi đã biên soạn & cài đặt gcc4.4 bằng macports.std :: lỗi thread (thread không phải là thành viên của std)

Khi tôi cố gắng biên dịch sử dụng -> g ++ -g Wall -ansi -pthread -std = C++ 0x main.cpp ...:

#include <thread> 
... 
    std::thread t(handle); 
    t.join(); 
.... 

Lợi nhuận biên dịch:

cserver.cpp: In member function 'int CServer::run()': 
cserver.cpp:48: error: 'thread' is not a member of 'std' 
cserver.cpp:48: error: expected ';' before 't' 
cserver.cpp:49: error: 't' was not declared in this scope 

Nhưng std::cout <<... biên dịch tốt ..

Có ai giúp tôi không?

+0

Nếu bạn nhìn vào tiêu đề chủ đề, dường như lớp chỉ tồn tại '# nếu định nghĩa (_GLIBCXX_HAS_GTHREADS) && định nghĩa (_GLIBCXX_USE_C99_STDINT_TR1) ' . Tôi không chắc chắn, những gì bạn phải làm để có những người được xác định. – UncleBens

+0

@UncleBens: Tôi tin rằng chúng được xác định trực tiếp bởi -pthread và -std = C++ 0x. Omitting -pthread gây ra lỗi seg: http://gcc.gnu.org/ml/gcc-help/2009-04/msg00208.html –

+0

Chỉ cần cập nhật mới nhất: MacPorts gcc 4.7.0 hỗ trợ/biên dịch std :: thread, trong khi 4.6.3 thì không. –

Trả lời

5

Thả -ansi, có nghĩa là -std = C++ 98, điều bạn rõ ràng không muốn. Nó cũng khiến macro __STRICT_ANSI__ được xác định và điều này có thể thay đổi hành vi của các tiêu đề, ví dụ: bằng cách tắt hỗ trợ C++ 0x.

+0

Tên macro thực sự có hai dấu gạch dưới ở cuối, nhưng SO giải thích sai dưới dạng định dạng nếu tôi viết chính xác. – Tronic

+0

Cũng chỉ ra, tôi gỡ bỏ nó, nhưng nó vẫn mang lại cho tôi cùng một lỗi .. Tôi đã thử với gcc4.4 và gcc4.5 beta ... Đây là bực bội. – luis

+0

đã khắc phục sự cố gạch dưới bị thiếu. –

13

gcc không hỗ trợ đầy đủ std :: chủ đề được nêu ra:

http://gcc.gnu.org/projects/cxx0x.html

http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html

Sử dụng boost::thread trong khi chờ đợi.

Sửa

Mặc dù những sản phẩm sau biên dịch và chạy tốt cho tôi với gcc 4.4.3:

#include <thread> 
#include <iostream> 

struct F 
{ 
    void operator()() const 
    { 
    std::cout<<"Printing from another thread"<<std::endl; 
    } 
}; 

int main() 
{ 
    F f; 
    std::thread t(f); 
    t.join(); 

    return 0; 
} 

Biên soạn với

 
g++ -Wall -g -std=c++0x -pthread main.cpp 

Sản lượng a.out:

 
Printing from another thread 

Bạn có thể cung cấp mã đầy đủ không? Có thể có một số vấn đề mơ hồ ẩn trong những số ...?

+0

Tôi đã thử mã của bạn và tôi nhận được cùng một lỗi ... Đây có phải là OSX liên quan không? Hoặc có thể cái gì đó không đúng với GCC cài đặt bởi MacPorts? – luis

+1

Có thể MacPorts không hỗ trợ đầy đủ chức năng C++ 0x? Bạn có đầu ra từ tập lệnh cấu hình gcc của mình không? Đây là một người dùng Mac cho cấu hình được chỉ định rằng std :: thread không được hỗ trợ: (http://www.mail-archive.com/[email protected]/msg00973.html) –

0

Tôi đã thử trên Ubuntu với GCC 4.4.1 và nó hoạt động như một sự quyến rũ. Vấn đề là Mac OS X cụ thể, bây giờ chỉ cần tìm hiểu lý do tại sao ...

0

Bạn có chắc là bạn đang kéo trình biên dịch đúng không? Bạn có gcc_select?

1

Tôi gặp sự cố tương tự trên cửa sổ sử dụng MinGW. Tôi đã tìm thấy các lớp trình bao bọc cho trên github mingw-std-threads Bao gồm các tệp mingw.mutex.h, mingw.thread.h vào thư mục MinGW toàn cầu đã khắc phục sự cố này. Tất cả tôi phải làm là bao gồm tập tin header và mã của tôi vẫn không thay đổi

#include "mingw.thread.h" 

... 
std::thread t(handle); 
... 
+0

Chúc mừng cho điều này. Đã khiến tôi phát điên. Câu trả lời của bạn hơi khó hiểu khi bạn giới thiệu đến thư mục MinGW toàn cầu. Tôi đã phải thả các tập tin trong thư mục dự án, nơi tất cả các tập tin .h khác là để có được nó làm việc ... nhưng nó đã làm việc. – CoreyRS

Các vấn đề liên quan