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


87

嗨,我正在尝试std::thread与G ++一起使用。这是我的测试代码

#include <thread>
#include <iostream>

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

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

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted 
Aborted

我的编译器版本:

$ 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.

我的测试代码有什么问题?

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

$ g++ -std=c++0x test.cpp
$ ./a.out

我尝试了

$ g++ -std=c++0x -lpthread test.cpp
$ ./a.out

还是一样。


7
@Earth Engine:这个SO答案说明了为什么没有pthread库就不会出现链接错误:stackoverflow.com/a/6266345/12711 简短答案:glibc许多pthread函数都有不执行操作的存根。
Michael Burr

@EarthEngine您能否将解决方案放在答案中?特别是-lpthread必须遵循源文件。

Answers:


101

我认为在Linux上使用pthread来实现,std::thread因此您需要指定-pthread编译器选项。

由于这是一个连接选项,这个编译器选项需要被的源文件:

$ g++ -std=c++0x test.cpp -pthread

我正在尝试使用gcc 4.7.1编译一个非常简单的程序,并且出现了非常相同的“不允许操作”错误。问题是我已经在使用-pthread标志。您还知道其他标志吗?
Filipe 2012年

5
我解决了从链接器选​​项中删除“ -static”标志的问题,不知道为什么会发生
Filipe 2012年

我想知道为什么没有-lpthread选项的编译器在编译时没有给出错误。有人吗?
zeus2

1
在Ubuntu 14.04 g ++ --version(g ++(Ubuntu / Linaro 4.8.1-10ubuntu9)4.8.1)下,我必须添加-W1,--no-as-needed g ++ --std = c ++ 11 -Wl, --no-
ne

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archive解决了问题,而不是-pthread。这是链接问题链接根据man gcc -pthread只是g ++选项添加了多线程支持,该多线程支持为预处理器和链接器设置了标志
Denis Zaikin



2

这是一个简单的CMake文件,用于编译使用线程的C ++ 11程序:

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
list(APPEND CMAKE_CXX_FLAGS "-pthread -std=c++11 ${CMAKE_CXX_FLAGS}")
add_executable(main main.cpp)

一种构建方法是:

mkdir -p build
cd build
cmake .. && make

2
您的解决方案对hmjd的回答没有任何改善,并增加了不必要的内容(分析,测试覆盖)
Max Beikirch 2014年

1

尝试在单个命令中以这种方式进行编译:

g++ your_prog.cpp -o your_output_binary -lpthread -std=gnu++11

您也可以尝试使用C ++ 11代替gnu ++ 11。希望这行得通。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.