리눅스 C++11에서 what(): Enable multithreading to use std::thread: Operation not permitted 에러 해결
Development/C,C++ 2016. 10. 26. 17:37OS: 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
'Development > C,C++' 카테고리의 다른 글
C++ STL: map에서의 해쉬값 처리의 중요성 (0) | 2017.03.31 |
---|---|
Eclipse CDT에서 C++11 문법이 에러로 표시되는 경우 (0) | 2016.10.26 |
Buffer overflow 발생 사례: strcat (2) | 2014.06.08 |
char array와 char pointer를 이용한 call by reference (0) | 2013.11.26 |
Visual Studio .NET / C 프로그래밍 / #pragma (0) | 2008.01.24 |