Các tùy chọn liên kết chính xác để sử dụng std :: thread trong GCC trong linux là gì?


87

Xin chào, tôi đang cố gắng sử dụng std::threadvới G ++. Đây là mã thử nghiệm của tôi

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}

Nó biên dịch, nhưng khi tôi cố gắng chạy nó, kết quả là:

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

Phiên bản trình biên dịch của tôi:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Mã thử nghiệm của tôi có gì sai?

CẬP NHẬT: Tôi sử dụng dòng lệnh sau để biên dịch và chạy mã của mình.

$ g++ -std=c++0x test.cpp
$ ./a.out

và tôi đã thử

$ g++ -std=c++0x -lpthread test.cpp
$ ./a.out

vẫn giống nhau.


7
@Earth Engine: câu trả lời SO này giải thích tại sao không có lỗi liên kết nào mà không có thư viện pthread: stackoverflow.com/a/6266345/12711 Câu trả lời ngắn gọn: glibckhông có gì sơ khai cho nhiều hàm pthread.
Michael Burr

@EarthEngine bạn có thể vui lòng đưa giải pháp vào một câu trả lời được không? Cụ thể là -lpthreadphải tuân theo tệp nguồn.
River

Câu trả lời:


101

Tôi nghĩ rằng trên Linux pthread được sử dụng để thực hiện std::threadvì vậy bạn cần chỉ định -pthreadtùy chọn trình biên dịch.

Vì đây là một tùy chọn liên kết, tùy chọn trình biên dịch này cần phải nằm SAU các tệp nguồn:

$ g++ -std=c++0x test.cpp -pthread

Tôi đang cố gắng biên dịch một chương trình rất đơn giản bằng gcc 4.7.1 và tôi đang gặp phải lỗi "hoạt động không được phép" rất giống nhau. Vấn đề là tôi đã sử dụng cờ -pthread. Có lá cờ nào khác mà bạn biết không?
Filipe

5
Tôi giải quyết vấn đề loại bỏ các "-static" cờ từ tùy chọn mối liên kết, không biết tại sao điều này xảy ra
Filipe

Tôi đang tự hỏi tại sao trình biên dịch không báo lỗi khi biên dịch mà không có tùy chọn -lpthread. Có ai không ??
zeus2

1
Trong Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1), tôi phải thêm -W1, --no-as-need g ++ --std = c ++ 11 -Wl, --no-as-need -pthread main.cc
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archivegiải quyết vấn đề, không phải -pthread. Đây là vấn đề liên kết liên kết Theo man gcc -pthreadchỉ là g ++ tùy chọn mà cho biết thêm đa luồng hỗ trợ mà bộ cờ cho cả tiền xử lý và mối liên kết
Denis Zaikin

6

Ngoài việc sử dụng -std=c++0x-pthreadbạn không được sử dụng -static.



2

Đây là một tệp CMake đơn giản để biên dịch một chương trình C ++ 11 sử dụng các chuỗi:

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
list(APPEND CMAKE_CXX_FLAGS "-pthread -std=c++11 ${CMAKE_CXX_FLAGS}")
add_executable(main main.cpp)

Một cách để xây dựng nó là:

mkdir -p build
cd build
cmake .. && make

2
Giải pháp của bạn là không có sự cải thiện so với câu trả lời của hmjd cho tôi và cho biết thêm thứ unnessary (hồ sơ, kiểm tra-bảo hiểm)
Max Beikirch

1

Hãy thử biên dịch theo cách này trong một lệnh:

g++ your_prog.cpp -o your_output_binary -lpthread -std=gnu++11

Bạn cũng có thể thử C ++ 11 thay vì gnu ++ 11. Hy vọng điều này hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.