在linux下的GCC中使用std :: thread的正确链接选项是什么?

Ear*_*ine 87 c++ multithreading g++ c++11

嗨,我正在尝试使用std::threadG ++.这是我的测试代码

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}
Run Code Online (Sandbox Code Playgroud)

它编译,但当我尝试运行它时,结果是:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted 
Aborted
Run Code Online (Sandbox Code Playgroud)

我的编译器版本:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)

我的测试代码出了什么问题?

更新:我使用以下命令行来编译和运行我的代码.

$ g++ -std=c++0x test.cpp
$ ./a.out
Run Code Online (Sandbox Code Playgroud)

我试过

$ g++ -std=c++0x -lpthread test.cpp
$ ./a.out
Run Code Online (Sandbox Code Playgroud)

还是一样.

更新:以下编译命令有效.

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 99

我认为在Linux上使用pthread实现std::thread所以你需要指定-pthread编译器选项.

由于这是一个连接选项,这个编译器选项必须是AFTER源文件:

$ g++ -std=c++0x test.cpp -pthread
Run Code Online (Sandbox Code Playgroud)

  • 我解决了从链接器选​​项中删除"-static"标志的问题,不知道为什么会发生这种情况 (5认同)

Bow*_*ens 6

除了使用-std=c++0x,-pthread不能使用-static.


小智 5

-std=c++11 -static -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archive一起工作-static!!!

请参阅此处:https : //gcc.gnu.org/bugzilla/show_bug.cgi?id=52590#c4