g++がC++11のthread周りを使う為に-lpthreadをユーザーが明示的に付けなければならない件
前にも似た事を書いた覚えはあるのだけど、またうっかり忘れてquickrun-vimでなぜ動かないーとか夜食を食べながらやってたのでメモ。忘れる度にメモ( ・`д・´)
状況
C++11のConcurrency周りはまだstd::threadしか試して居なかったので、より実用上便利なstd::futureやstd::asyncについて試そうとVimでお試しソースをひょろっと書いて\r(quickrun-vim)で実行してみようとした。
source
#include <iostream> #include <thread> #include <future> int main() { std::cout << "1" << std::endl; auto f = std::async( std::launch::async, [] { std::cout << "2" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "3" << std::endl; ); std::cout << "4" << std::endl; }
期待した実行結果
1 4 2 3
実際に見たもの
terminate called after throwing an instance of 'std::system_error' what(): Unknown error -1
知って無いとこの実行時エラーから原因へ辿り着く事は難しいと思うのよね・w・
問題と解決方法
g++ 4.7.0 現在に於いて C++11 標準ライブラリーのthread周りを扱う為には、コンパイルオプション -lpthread により libpthread のリンクを明示的にユーザーがコンパイラーへ指示する必要がある。
g++ -std=c++11 source.cpp -lpthread
チラ裏
- `#include <thread>`とか標準ライブラリーから必要なsoくらいg++が全自動でリンクする動作をデフォルトにしても良いのではないかと。
- pthreadリンク忘れにおける例外のwhatは事態を示唆する内容にした方が良いのではないかと。
- quickrun-vimにソースから自動的に-lしてくれる何かとかその対応とかしてくれてる人々が居るのでそれにも期待。( http://mattn.kaoriya.net/software/vim/20120525181657.htm )