std :: this_thread :: sleep_for()和GCC
当我尝试编译这个简单的程序时:
#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 -oa
我得到:
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还有一个旧的,未解决的bug报告: https : //bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145
更新date : 2012年10月19日 (jogojapan):这个问题现在已经由Jonathan Wakely解释和解决,作为这个问题的答案: 什么是_GLIBCXX_USE_NANOSLEEP? 这对于自己构buildGCC而不是使用现成包装的人来说尤其重要。
证实它在这里也不起作用。 (最近的GCC 4.6快照)。
你可以做明显的,并简单地定义它,然后再包含任何std ::标头。 有点肮脏,但会工作,直到GCC修复它(除非这是预期的行为)。 #define不应该破坏任何东西。 无论是在源代码或-D_GLIBCXX_USE_NANOSLEEP标志到GCC。
你可能想尝试使用-std = gnu ++ 0x而不是-std = c ++ 0x,因为gnu ++ 0x通常会像这样引入。
附加信息,以防止他人帮助:
我不需要在Ubuntu 11.10,gcc 4.6.1,glibc 2.13中定义_GLIBCXX_USE_NANOSLEEP
。
但我确实需要在Gentoo上使用-D_GLIBCXX_USE_NANOSLEEP进行编译,gcc 4.6.1,glibc 2.12.2。
我不打算编译更新glibc的Gentoo系统。 至less在周末之前;)
似乎工作没有定义在Ubuntu 13.04使用GCC版本4.7.3
需要在源代码的顶部定义_GLIBCXX_USE_NANOSLEEP
。
#define _GLIBCXX_USE_NANOSLEEP //add it top of c++ code
或者,编译以下逗号:
g++ a.cpp -oa -std=c++0x -D_GLIBCXX_USE_NANOSLEEP //compile c++ code ./a // run c++ code