与pthread的C ++ 11链接问题

时间:2014-08-08 14:07:37

标签: multithreading gcc c++11 pthreads dynamic-linking

我写了一个使用c ++ 11线程的简单代码。它编译正确,但当我尝试运行它时,我有以下错误:

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

我使用的是gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1)。这是我正在使用的makefile的输出

g++ -std=c++11 -DHAVE_CONFIG_H -I. -I../../../..  -I../../../.. -I/usr/local_machine/openmpi-1.6.5/include -pthread -DMPIPP_H -DENABLE_MPI=1    -O3 -Wall -DNDEBUG -funroll-loops -finline-functions -pthread -fomit-frame-pointer -ffast-math -mfpmath=sse -msse3 -MT threadtest-threadtest.o -MD -MP -MF .deps/threadtest-threadtest.Tpo -c -o threadtest-threadtest.o `test -f 'threadtest.cc' || echo './'`threadtest.cc
mv -f .deps/threadtest-threadtest.Tpo .deps/threadtest-threadtest.Po
/bin/bash ../../../../libtool  --tag=CXX   --mode=link g++ -std=c++11  -O3 -Wall -DNDEBUG -funroll-loops -finline-functions -pthread -fomit-frame-pointer -ffast-math -mfpmath=sse -msse3     -o threadtest threadtest-threadtest.o   -pthread -L/usr/local_machine/openmpi-1.6.5/lib -lmpi -ldl -lm -Wl,--export-dynamic -lrt -lnsl -lutil -lm -ldl ../../../../lib/libdunecommon.la -lm 
libtool: link: g++ -std=c++11 -O3 -Wall -DNDEBUG -funroll-loops -finline-functions -pthread -fomit-frame-pointer -ffast-math -mfpmath=sse -msse3 -o threadtest threadtest-threadtest.o -pthread -Wl,--export-dynamic  -L/usr/local_machine/openmpi-1.6.5/lib /usr/local_machine/openmpi-1.6.5/lib/libmpi.so -lrt -lnsl -lutil -ldl ../../../../lib/.libs/libdunecommon.a -llapack -lblas -lgfortran -lquadmath -lm -pthread -Wl,-rpath -Wl,/usr/local_machine/openmpi-1.6.5/lib -Wl,-rpath -Wl,/usr/local_machine/openmpi-1.6.5/lib

正如您所看到的那样,标志是-pthread。我究竟做错了什么?因为如果我编译一个简单的代码

  

g ++ threadstest.cc -o threadstest -pthread -std = c ++ 11

一切正常,因此在我的makefile中有一些干扰-pthread的东西,但我不明白它是什么。

其他信息:有效的解决方法是在链接阶段添加-Wl, - no-as-needed。

1 个答案:

答案 0 :(得分:2)

类似问题“Compiling multithread code with g++ (-Wl,--no-as-needed NOT working)

的答案

  

-pthread是编译器的标志,而不是链接器,链接器的右侧是-lpthread