g ++로 다중 스레드 코드 컴파일


89

가장 쉬운 코드가 있습니다.

#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;
}

나는 여전히 그것을 g++실행하기 위해 컴파일 할 수는 없지만 .

자세한 내용은:

$ 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.

컴파일 명령 :

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

달리는:

$ ./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)

그리고 지금은 막혔습니다. 인터넷상의 모든 관련 스레드에서 -pthread이미 가지고있는 동안 추가 하는 것이 좋습니다 .

내가 도대체 ​​뭘 잘못하고있는 겁니까?

추신 : 새로운 우분투 13.10 설치입니다. g++패키지 만 설치되고 chromium등의 사소한 것

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 : clang++(v3.2)를 사용하면 잘 컴파일되고 실행됩니다.

PPPPS : 여러분, Linux에서 GCC에서 std :: thread를 사용하는 올바른 링크 옵션무엇입니까?

PPPPPS :

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

libpthread-2.17.so동일한 디렉토리에 있는 심볼릭 링크 입니다.
zerkms

예, 올바른 링크입니다. 여기 내 디렉토리 lrwxrwxrwx가 있습니다. 1 개 루트 루트 (18) 9월 12일 20시 52분 libpthread.so.0 -> libpthread-2.16.so
제이슨 Enochs

@Jason Enochs : 저에게
효과적

참으로 당신의 모든 라이브러리는 나보다 조금 더 새로운 : GCC 버전 4.7.2 20121109 (레드햇 4.7.2-8) (GCC)
제이슨 Enochs

@Jason Enochs : 헤헤. 나 자신을 위해 나는 이미 대답은 "그것은 버그"아마도 완전히 확실 단지로, 이전 우분투 내일을 실행하려고합니다 만족 해요
zerkms

답변:


75

대답은 SO C ++ chat 의 친절한 회원이 제공했습니다 .

이 동작은 gcc 의 버그 로 인해 발생한 것 같습니다 .

해당 버그 토론의 마지막 댓글에 제공된 해결 방법 작동하고 문제를 해결합니다.

-Wl,--no-as-needed

8
SO와 당신 같은 녀석없이 내가 무엇을할까요? 당신은 머리를 잡아 당기는 머리를 구해주었습니다. 감사합니다 :)이는 (적어도 나를 위해)수록 같은 불분명
scorpiodawg

@scorpiodawg : 귀하의 의견은 내 저녁을 만들어, 감사합니다 :-)
zerkms

1
-pthread -lpthread -Wl,--no-as-needed이 작업을 수행하려면 모든 플래그 를 추가해야 했습니다.
상자성 크로아상

33

추가 -lpthread하면 동일한 문제가 해결되었습니다.

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

1
Jep, 이것은 anwser이고 또한 완전히 합리적입니다. "-Wl,-no-as-needed"는 이상하게 들렸고 저에게도 효과가 없습니다.
thesaint

3
당신은 확실히 필요합니다 -lpthread. 컴파일러 버전에 따라 필요할 수 있습니다-pthread -Wl,--no-as-needed . gcc-4.8.2가 필요합니다.
cdunn2001

12

나는 약간 더 고급 버전 (4.8.1 대신 4.8.4)을 가지고 있으며 위의 세 가지 답변을 모두 테스트했습니다. 사실로:

-pthread 혼자 작동 :

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

-Wl,--no-as-needed혼자 는 작동하지 않습니다 .

-lpthread혼자 는 작동하지 않습니다 .

-Wl,--no-as-needed-lpthread 함께의 작업 :

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

내 버전은 "g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4"입니다.


글쎄, 솔루션은 다른 버전에 대해 제공되었으며 확인한 답변이 확인한 순간 작동했음을 확신 할 수 있습니다. 어쨌든 실제 정보에 감사드립니다.
zerkms

9

qtcreator에 대한 답변이 이미 작성되었습니다.

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

콘솔 g ++의 경우 : 여기

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
감사합니다. 귀하의 답변은 -pthread가 컴파일러와 링커에 전달되어야 함을 명확하게하는 유일한 것입니다.
데님
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.