Linux의 GCC에서 std :: thread를 사용하는 올바른 링크 옵션은 무엇입니까?


87

안녕하세요 저는 std::threadG ++ 로 사용하려고합니다 . 내 테스트 코드는 다음과 같습니다.

#include <thread>
#include <iostream>

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

컴파일되지만 실행하려고하면 결과는 다음과 같습니다.

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

내 컴파일러 버전 :

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

내 테스트 코드에 어떤 문제가 있습니까?

업데이트 : 다음 명령 줄을 사용하여 코드를 컴파일하고 실행합니다.

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

그리고 나는 시도했다

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

여전히 동일합니다.


7
@Earth Engine :이 SO 대답은 pthread 라이브러리없이 링크 오류가없는 이유를 설명합니다. stackoverflow.com/a/6266345/12711 짧은 대답 : glibc많은 pthread 함수에 대해 아무것도하지 않는 스텁이 있습니다.
Michael Burr

@EarthEngine에 대한 답을 제시해 주시겠습니까? 구체적으로는 -lpthread해야한다 따라 소스 파일을.
River

답변:


101

Linux에서는 pthread가 구현 std::thread에 사용되므로 -pthread컴파일러 옵션 을 지정해야 한다고 생각합니다 .

연결 옵션 이므로이 컴파일러 옵션 은 소스 파일 뒤에 있어야합니다.

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

gcc 4.7.1을 사용하여 매우 간단한 프로그램을 컴파일하려고하는데 동일한 "작업이 허용되지 않음"오류가 발생합니다. 문제는 이미 -pthread 플래그를 사용하고 있다는 것입니다. 알고있는 다른 깃발이 있습니까?
Filipe

5
링커 옵션에서 "-static"플래그를 제거하는 문제를 해결했습니다. 왜 이런 일이 발생하는지 모르겠습니다
Filipe

-lpthread 옵션없이 컴파일 할 때 컴파일러가 오류를 표시하지 않는 이유가 궁금합니다. 아무도??
zeus2 2014

1
Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1)에서 -W1, --no-as-needed g ++ --std = c ++ 11 -Wl을 추가해야했습니다. -pthread main.cc을 --no-으로는 필요한
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archive문제가 아니라 -pthread. 이 링크 문제입니다 링크 에 따르면 man gcc -pthread지원 멀티 스레딩 추가합니다 그냥 g ++ 옵션이 프리 프로세서와 링커 모두 세트 플래그
데니스 Zaikin



2

다음은 스레드를 사용하는 C ++ 11 프로그램을 컴파일하기위한 간단한 CMake 파일입니다.

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)

구축하는 한 가지 방법은 다음과 같습니다.

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

2
귀하의 솔루션은 나를 위해 hmjd의 대답에 대해 아무런 개선이없고 unnessary 물건 (프로파일 링, 테스트 커버리지를) 추가
최대 Beikirch

1

단일 명령으로 다음과 같이 컴파일하십시오.

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

gnu ++ 11 대신 C ++ 11을 사용해 볼 수도 있습니다. 이것이 효과가 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.