2011-12-27 4 views
79

こんにちは、std::threadをG ++で使用しようとしています。ここに私のテストコードがlinuxの下でGCCのstd :: threadを使うための正しいリンクオプションは何ですか?

#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 

まだ同じことを試してみました。

UPDATE:次のコンパイルコマンドが機能します。私は、Linux pthreadの上だと思う

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

あなたはこれを構築するために使用されるコンパイラのコマンド/オプションを投稿することができます。 – hmjd

+0

確かに、私はポスト –

+1

を更新するでしょう@hmjdが言ったこと - あなたは '-lpthread'でビルドしましたか? – ildjarn

答えて

94

std::threadを実装するために使用されますので、-pthreadコンパイラオプションを指定する必要があります。

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

私は試しましたが、まだ動作していません... –

+0

'a.out'を削除して再試行できますか? – hmjd

+15

@Earth Engine - ソースファイルの後にライブラリを指定する必要があります: 'g ++ -std = C++ 0x test.cpp -lpthread' –

3

ここでスレッドを使用する簡単なC++ 11のプログラムをコンパイルするためのシンプルなcmakeのファイルがあります(デバッグ:このよう

は、リンクオプション、 AFTERソースファイルがあることをこのコンパイラオプションが必要ですバージョン):

CMakeLists.txt:

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

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

を使用することに加えて
mkdir build 
cd build 
cmake .. && make 
+2

あなたの解決策は私のためのhmjdの答えを改善していないし、不自然さを追加する(プロファイリング、テストカバレッジ) –

+1

彼の答えに対するコメントの多くは、それがうまくいきませんでした。 CMakeのソリューションは、C++ 11やスレッド化に慣れていない人たちのために、新しいプロジェクトを開始する良い方法を提供しながら、作業の可能性をはるかに上げるべきです。 – Alexander

5

-pthreadあなたがない使用-static必要があります。

4

-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

+0

これは '--whole-archive'で非常に大きくなります。私は静的なリンクのための[別の答え](http://stackoverflow.com/a/27774767/673826)がOpenWRTで私のために働くことが分かった – mlt

1

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

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

あなたはまた、代わりにGNU ++ 11のC++ 11を試すことができます。これがうまくいきたいです。

-1

使用この:

g++ -std=c++11 -pthread *** 
関連する問題