Biên dịch mã đa luồng với g ++


89

Tôi có mã dễ nhất từ ​​trước đến nay:

#include <iostream>
#include <thread>

void worker()
{
    std::cout << "another thread";
}

int main()
{
    std::thread t(worker);
    std::cout << "main thread" << std::endl;
    t.join();
    return 0;
}

mặc dù tôi vẫn không thể biên dịch nó với g++để chạy.

Thêm chi tiết:

$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1
Copyright (C) 2013 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.

Lệnh biên dịch:

$ g++ main.cpp -o main.out -pthread -std=c++11

Đang chạy:

$ ./main.out 
terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
Aborted (core dumped)

Và bây giờ tôi đang bị mắc kẹt. Trong mọi chủ đề liên quan trên internet, bạn nên thêm vào -pthreadkhi tôi đã có nó.

Tôi đang làm gì sai?

Tái bút: Đây là một bản cài đặt ubuntu 13.10 hoàn toàn mới. Chỉ có g++gói được cài đặt và những thứ nhỏ nhặt như chromiumv.v.

PPS:

$ ldd ./a.out 
linux-vdso.so.1 => (0x00007fff29fc1000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb85397d000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb853767000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb85339e000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb85309a000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fb853c96000)

PPPS: với clang++(v3.2) nó biên dịch và chạy tốt

PPPPS: guys, nó không phải là một bản sao của 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ì?

PPPPPS:

$ dpkg --get-selections | grep 'libc.*dev'
libc-dev-bin                    install
libc6-dev:amd64                 install
libclang-common-dev             install
linux-libc-dev:amd64                install

Đó là một liên kết tượng trưng libpthread-2.17.sotrong cùng một thư mục.
zerkms

Vâng, đó là một liên kết chính xác. Đây là dir lrwxrwxrwx của tôi. Gốc rễ 1 18 12 tháng 9 20:52 libpthread.so.0 -> libpthread-2.16.so
Jason Enochs

@ Jason Enochs: nó sẽ làm việc cho tôi - Tôi đồng ý, nếu tôi không sử dụng phiên bản gcc buggy
zerkms

Hết thảy các thư viện của bạn là một chút mới hơn so với tôi: phiên bản gcc 4.7.2 20.121.109 (Red Hat 4.7.2-8) (GCC)
Jason Enochs

@Jason Enochs: hehe. Đối với bản thân mình tôi đã hài lòng với "đó là một lỗi" câu trả lời, và có lẽ sẽ cố gắng chạy nó trên một ubuntu ngày mai già đi, chỉ để được hoàn toàn chắc chắn
zerkms

Câu trả lời:


75

Câu trả lời được cung cấp bởi một thành viên tốt bụng của cuộc trò chuyện SO C ++ .

Có vẻ như hành vi này là do lỗi trong gcc.

Cách giải quyết được cung cấp trong nhận xét cuối cùng của cuộc thảo luận về lỗi đó hoạt động và giải quyết được vấn đề:

-Wl,--no-as-needed

8
Tôi sẽ làm gì nếu không có SO và những người như bạn? Bạn đã cứu tôi một mớ tóc kéo. Cảm ơn :) Đây là như mơ hồ như nó được (cho tôi ít nhất)
scorpiodawg

@scorpiodawg: nhận xét của bạn đã làm buổi tối của tôi, cảm ơn :-)
zerkms

1
Tôi đã phải thêm tất cả các -pthread -lpthread -Wl,--no-as-neededlá cờ để có được tác phẩm này.
The Paramagnetic Croissant, 31/10/15

33

Thêm đã -lpthreadkhắc phục sự cố tương tự cho tôi:

 g++ -std=c++11 foo.cpp -lpthread -o foo

1
Jep, đây là một nhà cảm xạ và cũng hoàn toàn hợp lý. "-L, - không-cần-thiết" nghe có vẻ kỳ lạ và cũng không phù hợp với tôi.
thesaint

3
Bạn chắc chắn cần -lpthread. Bạn có thể cần -pthread -Wl,--no-as-needed, tùy thuộc vào phiên bản trình biên dịch. gcc-4.8.2 cần nó.
cdunn2001

12

Tôi có phiên bản nâng cao hơn một chút (4.8.4 thay vì 4.8.1) và tôi đã kiểm tra cả ba câu trả lời ở trên. Trong thực tế:

-pthread một mình hoạt động:

g ++ -std = c ++ 11 -o main -pthread main.cpp

-Wl,--no-as-neededmột mình không hoạt động .

-lpthreadmột mình không hoạt động .

-Wl,--no-as-needed-lpthread cùng nhau làm việc:

g ++ -std = c ++ 11 -o main -Wl, - no-as-need-as-need main.cpp -lpthread

Phiên bản của tôi là "g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4".


Chà, các giải pháp đã được cung cấp cho phiên bản khác và tôi có thể đảm bảo rằng câu trả lời đã chọn đã hoạt động tại thời điểm tôi kiểm tra nó. Dù sao, cảm ơn vì thông tin thực tế.
zerkms

9

câu trả lời đã được tạo cho qtcreator:

LIBS += -pthread
QMAKE_CXXFLAGS += -pthread
QMAKE_CXXFLAGS += -std=c++11

cho bảng điều khiển g ++: tại đây

g++ -c main.cpp -pthread -std=c++11         // generate target object file
g++ main.o -o main.out -pthread -std=c++11  // link to target binary

1
Cảm ơn bạn, câu trả lời của bạn là câu trả lời duy nhất làm rõ ràng rằng -pthread phải được chuyển đến trình biên dịch và trình liên kết.
denim
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.