2010-12-14 13 views
36

Cuando intento compilar este sencillo programa:std :: :: this_thread sleep_for() y GCC

#include<thread> 

void f() { 
    std::this_thread::sleep_for(std::chrono::seconds(3)); 
} 

int main() { 
    std::thread t(f); 
    t.join(); 
} 

con la versión de gcc 4.4.3 en Ubuntu 10.04 (32 bits):

$ g++ -std=c++0x -pthread a.cpp -o a 

obtengo:

error: ‘sleep_for’ is not a member of ‘std::this_thread’ 

Miré en el encabezado 'thread'.
sleep_for() está protegido con _GLIBCXX_USE_NANOSLEEP

#ifdef _GLIBCXX_USE_NANOSLEEP 
... 
/// sleep_for 
template<typename _Rep, typename _Period> 
    inline void 
    sleep_for(const chrono::duration<_Rep, _Period>& __rtime) 
... 

¿Por qué no _GLIBCXX_USE_NANOSLEEP definido?
¿Cómo consigo este ejemplo para compilar?


actualización 17 de Sep 2012 (jogojapan): me encontré con este mismo problema hoy en día, usando GCC 4.7.1. Me pregunto si hay alguna noticia sobre cómo evitarlo, que no sea definiendo _GLIBCXX_USE_NANOSLEEP. Intenté usar -std=gnu11, pero fue en vano.

También hay un viejo, informe de errores sin resolver para GCC 4.4: https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145


Actualización 19 Oct 2012 (jogojapan): El problema ya se ha explicado y resuelto por Jonathan Wakely como anwer a esta pregunta: What is _GLIBCXX_USE_NANOSLEEP all about? Esto es particularmente relevante para cualquiera que construya GCC por sí mismo en lugar de usar un paquete ya hecho.

Respuesta

26

Confirmado que no funciona aquí también. (Foto reciente de GCC 4.6).

Puede hacer lo obvio y simplemente definirlo antes de incluir cualquier std :: encabezados. Un poco sucio, pero funcionará hasta que GCC lo corrija (a menos que este sea el comportamiento previsto). El #define no debería romper nada de todos modos. Ya sea en origen o en el indicador -D_GLIBCXX_USE_NANOSLEEP a GCC.

Puede intentar usar -std = gnu ++ 0x en lugar de -std = C++ 0x, ya que gnu ++ 0x a menudo saca cosas como esta.

7

información adicional, en caso de que ayuda a alguien:

no necesito definir _GLIBCXX_USE_NANOSLEEP en Ubuntu 11.10, gcc 4.6.1, glibc 2.13.

Pero I do necesito compilar con -D_GLIBCXX_USE_NANOSLEEP en Gentoo, gcc 4.6.1, glibc 2.12.2.

No voy a compilar el sistema Gentoo para actualizar el glibc. Por lo menos no antes del fin de semana;)

+0

mismo problema en puertos mac osx mac 4.7.2 gcc con la solución del 'fix -D_GLIBCXX_USE_NANOSLEEP' se – pyCthon

3

parece funcionar sin definir en ubuntu 13.04 utilizando la versión de gcc 4.7.3

1

Necesidad de definir _GLIBCXX_USE_NANOSLEEP en la parte superior del código fuente.

#define _GLIBCXX_USE_NANOSLEEP //add it top of c++ code 

OR, compilar con siguiente commamd:

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