使用Code :: Blocks GNU编译器编译多线程代码

时间:2014-05-15 12:04:29

标签: c++ linux multithreading c++11 compilation

错误

我正在尝试使用 std :: thread ,但在尝试运行时出现此错误。

  

在抛出'std :: system_error'

的实例后终止调用      

what():启用多线程以使用std :: thread:不操作   允许

     

中止(核心倾销)

我的研究结果

有一个很多的问题,每个答案都说类似的事情: 我必须使用“-pthread”或“-lpthread”构建。有些人还说要添加“-Wl, - no-as-needed”。

Link Link Link Link Link Link Link

我尝试过很多东西,但都没有用。

详细

我在 Lubuntu 上使用 Code :: Blocks 12.11, GNU GCC 编译器进行编译。 在编译器设置菜单中,我检查了编译器标志

  

“让g ++遵循C ++ 11 ISO C ++语言标准[-std = c ++ 11]”

在其他选项中,我写了答案所说的,这是一个例子

-pthread
-Wl,--no-as-needed

这是我的构建日志(我不确定它是否重要)

g++ -Wall -fexceptions  -std=c++11 -g -pthread -Wl,--no-as-needed  -std=c++11   -I../DeskManagerDll -I/usr/include/X11/extensions -I/usr/include/X11  -c /home/julien/Documents/test/main.cpp -o obj/Debug/main.o
g++ -L/home/julien/Documents/DeskManagerDll -L-L/usr/lib/i386-linux-gnu  -o bin/Debug/test obj/Debug/main.o   -L/usr/X11R6/lib  -lX11 -lXext -lpthread -Wl,--no-as-needed  /home/julien/Documents/DeskManagerDll/bin/Debug/libDeskManagerDll.so 
Output size is 187,15 KB

我的问题

我做错了什么?我错过了什么?

修改

我做了一个非常简单的程序来排除任何其他问题。

#include <thread>

void test()
{

}

int main()
{
    std::thread thread_fct (test);
    return 0;
}

使用此程序的构建日志:

g++ -Wall -fexceptions  -std=c++11 -g -pthread -Wl,--no-as-needed  -std=c++11    -c /home/julien/Documents/test/main.cpp -o obj/Debug/main.o
g++  -o bin/Debug/test obj/Debug/main.o    

我仍然有完全相同的错误。我真的不知道该尝试什么。 你有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您的第一个问题是-lpthread是链接器选项,因此它属于链接器行(第二个命令)而不是编译行。 (请注意,参数的顺序可能很重要;我通过将-lpthread放在最后上来实现。我还尝试使用-pthread代替-lpthread,它看起来确实有效,并且对链接器上的位置也不太敏感。但同样,它是链接器选项,而不是编译选项。 )

修复之后,我能够让您的程序编译并运行,但它以不同的异常退出:terminate called without an active exception。要解决此问题,请在thread_fct.join();中致电main()。 (所有线程必须在超出范围之前加入,分离或移动,否则您的程序将中止。)

答案 1 :(得分:2)

对代码:: blocks:

有用的方法
  1. 项目 - &gt;构建选项 - &gt;让g ++遵循C ++ 11 ISO ... [-std = c + 11](选择复选框)

  2. 项目 - &gt;构建选项 - &gt;链接器设置 - &gt;其他链接器选项添加

    -Wl,--no-as-needed
    -pthread