LinuxのGCCでstd :: threadを使用するための正しいリンクオプションは何ですか?


87

こんにちは私はstd::threadG ++で使用しようとしています。これが私のテストコードです

#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 2011

@EarthEngineソリューションを回答に入れていただけますか?具体的には、はソースファイルに従う-lpthread必要あります。

回答:


101

Linuxではpthreadを使用して実装してstd::threadいると思うので、-pthreadコンパイラオプションを指定する必要があります。

これはリンクオプションであるため、このコンパイラオプションは次のようにする必要があります。 、AFTERソースファイル:

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

gcc 4.7.1を使用して非常に単純なプログラムをコンパイルしようとしていますが、まったく同じ「操作が許可されていません」というエラーが発生します。問題は、私がすでに-pthreadフラグを使用していることです。あなたが知っている他の旗はありますか?
Filipe 2012

5
リンカーオプションから「-static」フラグを削除する問題を解決しました。なぜこれが発生するのかわかりません
Filipe

-lpthreadオプションなしでコンパイルしたときにコンパイラがエラーを出さないのはなぜだろうと思います。誰か?
zeus2 2014

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-として、必要に応じて-pthread main.cc
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiveではなく、問題を解決します-pthread。これはリンクの問題です。リンクによるとman gcc -pthread、プリプロセッサとリンカーの両方にフラグを設定するマルチスレッドサポートを追加するg ++オプションです
Denis Zaikin 2015



2

スレッドを使用するC ++ 11プログラムをコンパイルするための簡単なCMakeファイルを次に示します。

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)

それを構築する1つの方法は次のとおりです。

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

2
あなたの解決策は、私にとってhmjdの答えを改善するものではなく、不必要なもの(プロファイリング、テストカバレッジ)を追加します
Max Beikirch 2014

1

この方法で1つのコマンドでコンパイルしてみてください。

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

gnu ++ 11の代わりにC ++ 11を試すこともできます。これがうまくいくことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.