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

Hec*_*kel 6 c++ linux multithreading compilation c++11

错误

我试图使用std :: thread,但是当我尝试运行它时我有这个错误.

抛出'std :: system_error'的实例后终止调用

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

中止(核心倾倒)

我的研究结果

关于它有很多问题,每个答案都说类似的东西:我必须用"-pthread"或"-lpthread"构建.有些人还说要添加"-Wl, - no-as-needed".

链接 链接 链接 链接 链接 链接 链接

我尝试了很多东西,但都没有用.

细节

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

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

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

-pthread
-Wl,--no-as-needed
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我的问题

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

编辑

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

#include <thread>

void test()
{

}

int main()
{
    std::thread thread_fct (test);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用此程序的构建日志:

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    
Run Code Online (Sandbox Code Playgroud)

我仍然有完全相同的错误.我真的不知道该尝试什么.你有什么主意吗 ?

Ada*_*son 5

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

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