2012-05-01 42 views
11

Tôi đã thử nghiệm một ví dụ về các chủ đề C++ 11 trong Eclipse. Nhưng tôi đã nhận thông báo này khi chạy chương trình:Làm sao để CDT/Eclipse làm việc với các chủ đề C++ 11?

terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted'

hệ thống của tôi: ubuntu + gcc 4.7

Chương trình:

#include <iostream> 
#include <thread> 

void worker() 
{ 
    std::cout << "hello from worker" << std::endl; 
} 

int main(int argc, char **argv) 
{ 
    std::thread t(worker); 
    t.join(); 
} 

... và vâng, tôi đặt -std=c++11-pthread bên C/C++ Build -> Settings -> Tool Settings -> Cross G++ Compiler -> Miscellaneous -> Other Flags .

Mọi nhận xét?

+0

Có vẻ lạ khi đặt những cài đặt đó trong phần "trình biên dịch chéo" (nhưng tôi không biết Eclipse). Sự cố có thể lặp lại nếu cờ '-pthread' không xuất hiện trên dòng lệnh và bạn đã cài đặt các phiên bản libstdC++ khác. Vì vậy, hãy chắc chắn rằng lá cờ thực sự được chuyển đến trình biên dịch của bạn – Mat

+0

Đây là một ngoại lệ thời gian chạy, do đó, mã biên dịch chính xác. Tuy nhiên tôi không hiểu trong trường hợp này thông báo ngoại lệ này sẽ xảy ra ... – Klaim

+1

@ Khen: lỗi đó xuất hiện nếu bạn liên kết với sai libstdC++, điều này có thể xảy ra nếu bạn có nhiều phiên bản được cài đặt và bạn không vượt qua '- pthread' (hoặc cài đặt GCC của bạn được borked) – Mat

Trả lời

10

Sự cố đã được giải quyết bằng nhận xét của Jonathan Wakely.

Tôi đã thêm -pthread vào C/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags và chương trình hoạt động chính xác.

Cảm ơn bạn Jonathan.

+0

Đối với tôi nó là '... -> CCC C++ Linker -> Miscellaneous -> Linker flags' – gsamaras

0

Để làm việc C++ 11 std::thread trong Eclipse, bạn cần cung cấp tùy chọn -pthread khi biên dịch. Tuy nhiên không đủ. Trong Ubuntu của tôi 14.04, với Eclipse Kepler và g ++ 4.9 dưới đây làm cho nó hoạt động:

  1. Nhấp chuột phải vào dự án và chọn 'Properties'
  2. Đến 'C/C++ Build'> 'Settings'> (tab) 'Cài đặt công cụ'
  3. Đầu tiên chọn 'Trình biên dịch chéo G ++'> 'Khác'> 'Cờ khác';
    và thêm -pthread sau -std=c++11
  4. Chọn thứ hai 'Cross G ++ Linker'> 'Libraries';
    và thêm pthread (tương đương chỉ huy dòng -lpthread)

Cuối cùng tái biên dịch dự án; lỗi nên đi.

Cũng nên nhớ rằng nếu bạn sử dụng, std::thread thì đối tượng của nó phải là join() ở đâu đó. Khác mà bạn có thể nhận được dưới đây lỗi runtime:

terminate called without an active exception

1
  1. Đến Project> Properties> C/C++ chung> Preprocessor bao gồm đường dẫn, vv> Nhà cung cấp> CDT GCC Builtin Compiler Cài đặt và thêm -std=c++11 để trình biên dịch thông số kỹ thuật.

    Bạn cũng có thể làm điều này cho tất cả các dự án sẽ Window> Preferences> C/C++> Xây dựng> Cài đặt> Discovery và thêm -std=c++11 đến CDT GCC Builtin Compiler Cài đặt thông số kỹ thuật.

    ${COMMAND} ${FLAGS} -E -P -v -dD -std=c++11 "${INPUTS}" 
    
  2. Project Properties> C/C++ Xây dựng> Cài đặt> Công cụ Cài đặt> GCC C++ Compiler> Miscellaneous> cờ khác, thêm -pthread -std=c++11 -Wl,--no-as-needed:

    -c -fmessage-length=0 -pthread -std=c++11 -Wl,--no-as-needed 
    
  3. Project Properties> C/C++ Xây dựng> Cài đặt> Cài đặt công cụ> GCC C++ Trình kết nối> Khác biệt> Cờ liên kết, thêm -pthread -std=c++11 -Wl,--no-as-needed

    -pthread -std=c++11 -Wl,--no-as-needed 
    
Các vấn đề liên quan