[Eclipse]多线程程序编译时的问题以及解决方案

>>One

问题情景

#include 
#include 
#include 
#include 

using namespace std;

void do_some_work()
{
    cout << "1" << endl;
}

int main()
{
    std::thread a(do_some_work);
    a.join();

    std::map cp;
    cp[1] = 3;
    cp[1] = 4;
    cp.insert(pair(3,5));
    auto aa = cp.at(3);
    cout << aa << endl;

    return 0;
}

运行报错:terminate called after throwing an instance of 'std::system_error' what(): Enable multithreading to use std::thread: Operation not permitted

怎么做

  1. Window > Preference > Build > Settings > Discovery > CDT GCC Built-in Compiler Settings(shared) 中的(command to get compiler specs) 改为
${COMMAND} -E -P -v -dD "${INPUTS}" -std=c++11
  1. 新建工程项目
  • Properties > C/C++ Build > Settings > Tool Settings > GCC C++ Linker > Miscellanous > Linker flags 处添加参数
-Wl,--no-as-needed -pthread
  • Properties > C/C++ Build > Settings > Tool Settings > GCC C++ Compiler > Miscellanous > Other flags 尾处添加参数
-std=c++11

为什么这么做

  • 为什么不直接在GCC C++ Compiler 添加参数?
    因为Eclipse是先编译成静态库然后生成可执行文件,那么需要在链接阶段添加参数。
  • 为什么要在CDT那里设置 -std=c++11?
    因为GCC C++ Compiler 中 -std=c++11 并没有在代码检查中生效

你可能感兴趣的:([Eclipse]多线程程序编译时的问题以及解决方案)