この簡単なプログラムをコンパイルしようとすると:
#include<thread>
void f() {
std::this_thread::sleep_for(std::chrono::seconds(3));
}
int main() {
std::thread t(f);
t.join();
}
ubuntu 10.04(32ビット)上のgccバージョン4.4.3:
$ g++ -std=c++0x -pthread a.cpp -o a
私は得ます:
error: ‘sleep_for’ is not a member of ‘std::this_thread’
ヘッダー「スレッド」を調べました。
sleep_for()は_GLIBCXX_USE_NANOSLEEPで保護されています
#ifdef _GLIBCXX_USE_NANOSLEEP
...
/// sleep_for
template<typename _Rep, typename _Period>
inline void
sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
...
_GLIBCXX_USE_NANOSLEEP
が定義されていないのはなぜですか?
この例をコンパイルするにはどうすればよいですか?
2012年9月17日更新(jogojapan):GCC 4.7.1を使用して、今日同じ問題に遭遇しました。 _GLIBCXX_USE_NANOSLEEP
を定義する以外に、それを回避する方法についてのニュースはありますか。 -std=gnu11
を使用してみましたが、役に立ちませんでした。
GCC 4.4の古い未解決のバグレポートもあります: https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145
2012年10月19日更新(jogojapan):この問題は、この質問への回答としてJonathan Wakelyによって説明および解決されました: _GLIBCXX_USE_NANOSLEEP all about? これは、既成のパッケージを使用するのではなく、GCCを自分でビルドする人に特に関係があります。
ここでも動作しないことを確認。 (最近のGCC 4.6スナップショット)。
Std ::ヘッダーをインクルードする前に、明白なことを行い、それを定義するだけです。少し汚いですが、GCCが修正するまで機能します(これが意図された動作でない限り)。 #defineが何も壊してはいけません。ソースまたはGCCへの-D_GLIBCXX_USE_NANOSLEEPフラグのいずれか。
-std = c ++ 0xではなく-std = gnu ++ 0xを使用することをお勧めします。これは、gnu ++ 0xがしばしばこのようなものを取り込むためです。
誰かを助ける場合の追加情報:
Ubuntu 11.10、gcc 4.6.1、glibc 2.13では_GLIBCXX_USE_NANOSLEEP
を定義する必要はありません。
しかし、私はdo Gentoo、gcc 4.6.1、glibc 2.12.2で-D_GLIBCXX_USE_NANOSLEEPを使用してコンパイルする必要があります。
Glibcを更新するためにGentooシステムをコンパイルするつもりはありません。少なくとも週末の前ではありません;)
Gccバージョン4.7.3を使用してubuntu 13.04で定義なしで機能しているようです
ソースコードの上に_GLIBCXX_USE_NANOSLEEP
を定義する必要があります。
#define _GLIBCXX_USE_NANOSLEEP //add it top of c++ code
または、次のcommamdでコンパイルします。
g++ a.cpp -o a -std=c++0x -D_GLIBCXX_USE_NANOSLEEP //compile c++ code
./a // run c++ code