问题 如何使CDT / Eclipse与C ++ 11线程一起使用?


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

任何意见?


10165
2018-05-01 09:38


起源

将这些设置放在“交叉编译器”部分看起来很奇怪(但我不知道Eclipse)。如果是,崩溃是可重复的 -pthread 命令行中不存在flag,并且您安装了其他版本的libstdc ++。因此,请确保将标志传递给您的编译器 - Mat
这是运行时异常,因此代码可以正确编译。我仍然不明白在哪种情况下应该发生此异常消息... - Klaim
@Klaim:如果你链接错误的libstdc ++会出现这个错误,如果你安装了多个版本并且你没有通过它会发生这种错误 -pthread (或你的GCC安装是borked) - Mat
我认为 -pthread 传递给编译器,因为我把它放在我放的同一个地方 -std=c++11,当我没有放入时,代码将不会被编译 -std=c++11。更奇怪的是,当我从命令行手动编译代码时,代码正常工作。 - melmi
这个错误肯定发生在 -pthread未使用(即使您只安装了一个libstdc ++)。确保 -pthread 用于编译器命令 和 链接器命令。否则libpthread.so将不会链接到,并且无法在运行时启动线程。 - Jonathan Wakely


答案:


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

我补充道 -pthread 至 C/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags 并且该程序正常工作。

谢谢乔纳森。


10
2018-05-05 07:50



对我来说是 ... -> CCC C++ Linker -> Miscellaneous -> Linker flags - gsamaras
嗯,这使得我的程序在eclipse中运行并调试okey,但是当我使用std :: thread或thread.join时,语法检查器仍然给我错误。有谁知道如何解决这个问题? - kaefert


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

  1. 右键单击Project并选择“Properties”
  2. 转到“C / C ++ Build”>“设置”>(选项卡)“工具设置”
  3. 首先选择'Cross G ++ Compiler'>'Miscellaneous'>'Other flags';
    并添加 -pthread 后 -std=c++11
  4. 第二步选择'Cross G ++ Linker'>'Libraries';
    并添加 pthread (相当于 命令行 -lpthread

最后重新编译项目;错误应该去。

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

终止被调用而没有活动异常


1
2017-07-24 12:51





  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
    

1
2017-10-26 11:50