にゃははー

はへらー

libstdc++で_GLIBCXX_USE_NANOSLEEPがないとstd::sleep_for/std::sleep_untilが定義されない件について

結構前から議論が上がってて見てたけどそういえば書いてなかったので今更ですけど...

例えばLinuxPOSIX系OSで

#include <chrono>
#include <thread>

int main()
{
	std::this_thread::sleep_for(std::chrono::seconds(1));
}

としてもGCCは

hoge.cpp: In function ‘int main()’:
hoge.cpp:6: error: ‘sleep_for’ is not a member of ‘std::this_thread’

とか言ってくるわけです。

かと言って_GLIBCXX_USE_NANOSLEEPをdefineするのもあまりよろしくありません。

これについての議論がbugzillaで行われています。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52680
これによるとlibstdc++のconfigureでチェックしようということになっています。
4.8で入るかまではわからないですが、リリースまで結構時間があるので入るのではないでしょうか。

また、Linuxはnanosleepを持っているのがわかりきっているので、GCCのビルド時のconfigureに

--enable-libstdcxx-time=rt

を指定すればいいようです。

Ubuntu12.04のgcc-4.6パッケージはデフォルトで付いているのでデフォルトで使う分には問題ないようです。
Ubuntu12.04のgcc-4.6パッケージのconfigureを見る限り

--enable-libstdcxx-time=yes

でもいいようなのでこんな感じで適当にやればsleep_for/sleep_untilが使えるようになるはずです。

MacOSやBSDとかはちょっと分からないのでyesとか書いて試してみてください。