GCC 4.7.3でC++11のsleep_for()を呼ぶとコンパイルできない件


このエントリーをはてなブックマークに追加

Cygwin + GCC 4.7.3 な構成で、C++11のstd::thread::sleep_for()を使ってみようと以下のコードを書いた。

#include <thread>
#include <chrono>

int main() {
    std::this_thread::sleep_for(std::chrono::milliseconds(300));
    return 0;
}

以下のコマンド

g++ -std=c++11 sleep_for.cpp

コンパイルしようとすると

エラー: ‘sleep_for’ is not a member of ‘std::this_thread’

と怒られコンパイル失敗。どうやらGCC 4.7.3ではstd::this_thread::sleep_for()がそのままでは使えないらしい。


c++ - What is _GLIBCXX_USE_NANOSLEEP all about? - Stack Overflowによると解決方法は3つある。

GCCを4.8に上げる

正攻法その1。

GCC 4.7.3のビルド時に--enable-libstdcxx-timeオプションを有効にする

正攻法その2。GCCのconfigureを実行するとき、オプション--enable-libstdcxx-timeを加える。このオプションはデフォルトでは有効にならないらしい。

_GLIBCXX_USE_NANOSLEEPマクロを有効にする

コード中に

#define _GLIBCXX_USE_NANOSLEEP 

と加えるか、コンパイルオプションに

-D_GLIBCXX_USE_NANOSLEEP 

と加えるかしてマクロを有効にするとsleep_for()が使えるようになる。naughtyでunsupportedな方法だけど動くでしょう、とのこと。


めんどくさいので私はとりあえず3つ目の方法でお茶を濁すことに。