如何使 CDT/Eclipse 与 C++11 线程一起工作

How to make CDT/Eclipse work with C++11 threads?

本文关键字:C++11 线程 一起 工作 Eclipse 何使 CDT      更新时间:2023-10-16

我试图在Eclipse中测试一个C++11线程的例子。但是我在运行程序时收到此消息:

在抛出"std::system_error"实例后终止调用 what(): 不允许操作'

我的系统:ubuntu + gcc 4.7

程序:

#include <iostream>
#include <thread>
void worker()
{
    std::cout << "hello from worker" << std::endl;
}
int main(int argc, char **argv)
{
    std::thread t(worker);
    t.join();
}

。是的,我把-std=c++11-pthread放在C/C++ Build -> Settings -> Tool Settings -> Cross G++ Compiler -> Miscellaneous -> Other Flags里面.

有什么意见吗?

这个问题由Jonathan Wakely的评论解决了。

我在C/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags中添加了-pthread,程序运行正常。

谢谢乔纳森。

要在 Eclipse 中工作 C++11 std::thread,需要在编译时提供-pthread选项。然而,这还不够。在我的 Ubuntu 14.04 中,下面的 Eclipse Kepler 和 g++4.9 使其工作:

  1. 右键单击项目并选择"属性"
  2. 转到"C/C++构建">"设置">(选项卡)"工具设置"
  3. 首先选择"交叉 G++ 编译器">"杂项">"其他标志";
    并添加 -std=c++11-pthread
  4. 第二个选择"交叉 G++ 链接器">"库";
    并添加pthread(等效到命令行 -lpthread

最后重新编译项目;错误应该消失了。

还要记住,如果你使用,std::thread那么它的对象必须在某处join()。否则,您可能会收到以下运行时错误:

终止调用而不显示活动异常

  1. 转到 C/C++ 常规>预处理器包含路径等的项目>>属性>提供程序> CDT GCC 内置编译器设置,并将-std=c++11附加到编译器规范。

    您还可以对转到窗口>首选项> C/C++> 生成>设置>发现的所有项目执行此操作,并将-std=c++11附加到 CDT GCC 内置编译器设置规范。

     ${COMMAND} ${FLAGS} -E -P -v -dD -std=c++11 "${INPUTS}"
    
  2. > C/C++ 生成>设置> GCC C++编译器>杂项>其他标志的工具>设置项目属性,请添加-pthread -std=c++11 -Wl,--no-as-needed

     -c -fmessage-length=0 -pthread -std=c++11 -Wl,--no-as-needed
    
  3. > C/C++ 生成>设置> GCC C++链接器>杂项>链接器标志>的工具设置项目属性,添加-pthread -std=c++11 -Wl,--no-as-needed

     -pthread -std=c++11 -Wl,--no-as-needed