std::this_thread::sleep_for() and GCC

41
当我尝试编译这个简单的程序时:
#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’

我查看了“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在回答What is _GLIBCXX_USE_NANOSLEEP all about?时解释并解决了此问题。对于自己构建GCC而不是使用现成包的人来说,这尤其相关。
4个回答

32

确认在这里也不起作用(最近的GCC 4.6快照)。

你可以做明显的事情,只需在包含任何std::头文件之前定义它。有点不干净,但在GCC修复它之前都会起作用(除非这是预期的行为)。#define不应该损坏任何东西。可以在源文件中使用,或者将-D_GLIBCXX_USE_NANOSLEEP标志传递给GCC。

你可能想尝试使用-std=gnu++0x而不是-std=c++0x,因为gnu++0x通常会拉入这样的东西。


7

附加信息,如果有用的话:

在Ubuntu 11.10,gcc 4.6.1和glibc 2.13中,我不需要定义_GLIBCXX_USE_NANOSLEEP

但是在Gentoo,gcc 4.6.1和glibc 2.12.2中,我需要使用-D_GLIBCXX_USE_NANOSLEEP编译。

我不打算编译Gentoo系统来更新glibc,至少在周末之前不会这样做;)


在Mac OS X上,使用Mac Ports和GCC 4.7.2出现了相同的问题,通过-D_GLIBCXX_USE_NANOSLEEP修复可以解决它。 - pyCthon

3

在使用gcc版本4.7.3的Ubuntu 13.04上,似乎可以不使用define命令就能正常工作。


1
需要在源代码的顶部定义_GLIBCXX_USE_NANOSLEEP
#define _GLIBCXX_USE_NANOSLEEP  //add it top of c++ code

或者,使用以下命令进行编译:

g++ a.cpp -o a -std=c++0x -D_GLIBCXX_USE_NANOSLEEP    //compile c++ code
./a       // run c++ code

无法在 macOS 上工作。 - Nicholas Jela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接