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

6

错误

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

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

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

Aborted (core dumped)

我的研究结果

有很多关于这个问题的提问,每一个回答都说类似的事情: 我必须用"-pthread"或"-lpthread"来构建。一些人还说要添加"-Wl,--no-as-needed"。

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

我尝试了很多方法,但没有一个起作用。

细节

我正在使用Lubuntu上的Code::Blocks 12.11、GNU GCC编译器进行编译。 在编译器设置菜单中,编译器标志下我勾选了以下选项

"Have g++ follow the C++11 ISO C++ language standard [-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
尝试在.so编译中也添加“-pthread”。 - juanchopanza
我不知道该怎么做,你知道我应该搜索什么来找到可以修改它的地方吗?我在所有这些中有点迷失了。 - Heckel
在您的第二个 g++ 行中加入 -pthread(可能需要删除 -lpthread-pthread 应该会为您处理它。) - juanchopanza
它是由Code::Blocks自动生成的。我可以通过选项进行修改,但“其他选项”字段会更改第一行。 - Heckel
在我看来,标准库重新定义EPERM的含义有点出乎意料。 - Brian Cain
对不起,我不明白你的意思。是错误还是我的编译器设置出了问题? - Heckel
2个回答

6
你面临的第一个问题是-lpthread是一个链接器选项,它应该在链接器行(第二个命令)而不是编译行。请注意参数的顺序可能很重要;我把-lpthread放在最后才能让它工作。我还尝试了使用-pthread替换-lpthread,这似乎也可以工作,并且对链接器行中的位置不太敏感。但再次提醒,它是一个链接器选项,而不是编译选项。
修正这个问题之后,我得以编译并运行你的程序,但它退出时出现了另一个异常:terminate called without an active exception。为了解决这个问题,在main()中调用thread_fct.join();。(所有线程在超出其范围之前必须加入、分离或从中移动,否则你的程序将中止。)

2
我发现对于code::blocks,以下方法很有用:
  1. Project -> Build options -> Have g++ follow C++11 ISO ... [-std=c+11] (select checkbox)

  2. Project -> Build options -> Linker settings -> Other linker options add there

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接