반응형

OS: Ubuntu 14.04 (amd64)

g++ version: 4.8.4



C++11에 정의되어 있는 thread를 코드에 사용해서 이클립스에서든 Makefile을 직접 써서든 그냥 빌드하면 컴파일 에러가 나는데, 이 때는 -std=c++11 플래그를 추가하라고 나와 있다. [5]

다만 쓰려는 코드가 또 쓰레드이기 때문에 -pthread도 추가하도록 되어 있다.


하지만 위와 같은 플래그를 추가하고 나서도 실행 단계에서 아래와 같은 에러가 나면서 실행이 중단된다.


terminate called after throwing an instance of 'std::system_error'

  what(): Enable multithreading to use std::thread: Operation not permitted


StackOverflow [1, 2]를 보면 gcc의 버그라는 게 결론이고, gcc 패키지에도 버그로 보고되어 있다 [3]. 


해결책으로 특정 flag를 추가해 줘야 한다고 나와 있다.

기본적으로 -Wl,--no-as-needed 를 추가해 주면 된다고 한다.


그런데 내 경우에는 g++ 4.8.4를 쓰고 있어서 flag 하나를 더 추가해 줘야 한다는 댓글이 있어서 최종적으로 -std=c++11 -pthread -lpthread -Wl,--no-as-needed 이렇게 추가를 했더니 빌드와 실행 모두 잘 되었다.


Eclipse CDT에서 설정하는 방법은 [4]에 설명되어 있다. Project Properties에서 C/C++ Build 부분은 빌드할 때 옵션이고, C/C++ General 쪽에 해주는 설정은 아마 에디터에서 보여지는 문법상의 에러를 표시할 때 필요한 것 같은데, 이상하게 에디터 쪽에서는 잘 적용이 되지 않는 것 같았다.




<참고자료>

[1] http://stackoverflow.com/questions/19463602/compiling-multithread-code-with-g

[2] http://chat.stackoverflow.com/transcript/message/12447014#12447014

[3] https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1228201

[4] http://wiki.eclipse.org/CDT/User/FAQ#CDT_does_not_recognize_C.2B.2B11_features

[5] http://stackoverflow.com/questions/9131763/eclipse-cdt-c11-c0x-support



반응형
블로그 이미지

Bryan_

,