【问题标题】:Compiling multithread code with Code::Blocks GNU compiler使用 Code::Blocks GNU 编译器编译多线程代码
【发布时间】:2014-05-15 12:04:28
【问题描述】:

错误

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

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

what(): 启用多线程以使用 std::thread: Operation not 允许

中止(核心转储)

我的研究结果

有很多关于它的问题,每个答案都说类似的话: 我必须使用“-pthread”或“-lpthread”构建。也有人说要加上“-Wl,--no-as-needed”。

LinkLinkLinkLinkLinkLinkLink

我尝试了很多东西,但都没有成功。

详情

我在 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    

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

【问题讨论】:

  • 尝试将-pthread也添加到.so编译中。
  • 我不知道该怎么做,你知道我应该用谷歌搜索哪里可以修改吗?我有点迷失在这一切中
  • 在你的第二行 g++ 中,添加 -pthread (并可能删除 -lpthread-pthread 应该会为你这样做。)
  • 已经由code::blocks自动生成。我可以通过选项对其进行修改,但“其他选项”字段会更改第一行。
  • IMO 标准库开始重载 EPERM 以表示完全不同的含义有点出乎意料。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    对我有用的方式 code::blocks:

    1. 项目 -> 构建选项 -> 让 g++ 遵循 C++11 ISO ... [-std=c+11](选中复选框)

    2. 项目 -> 构建选项 -> 链接器设置 -> 其他链接器选项添加在那里

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多