>>One
问题情景
#include <map>
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void do_some_work()
{
cout << "1" << endl;
}
int main()
{
std::thread a(do_some_work);
a.join();
std::map<int,int> cp;
cp[1] = 3;
cp[1] = 4;
cp.insert(pair<int ,int>(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
怎么做
- 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
- 新建工程项目
- 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 并没有在代码检查中生效