2010-12-14 23 views
36

Quando provo a compilare questo semplice programma:std :: :: this_thread sleep_for() e GCC

#include<thread> 

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

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

con gcc version 4.4.3 su Ubuntu 10.04 (32 bit):

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

Ottengo:

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

Ho cercato nell'intestazione 'thread'.
sleep_for() è protetto 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) 
... 

Perché _GLIBCXX_USE_NANOSLEEP non definiti?
Come posso ottenere questo esempio da compilare?


Aggiornamento 17 set 2012 (jogojapan): Mi sono imbattuto in questo stesso problema di oggi, utilizzando GCC 4.7.1. Mi chiedo se ci sono notizie su come evitarlo, oltre a definire _GLIBCXX_USE_NANOSLEEP. Ho provato a utilizzare -std=gnu11, ma senza successo.

C'è anche un vecchio, segnalazione di bug irrisolti per GCC 4.4: https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145


Aggiornamento 19 ottobre 2012 (jogojapan): Il problema è stato spiegato e risolto da Jonathan Wakely come un Anwer a questa domanda: What is _GLIBCXX_USE_NANOSLEEP all about? Questo è particolarmente rilevante per chiunque costruisca GCC stesso invece di usare un pacchetto già pronto.

risposta

26

Confermato che non funziona anche qui. (Istantanea GCC 4.6 recente).

Si potrebbe fare l'ovvio e definirlo semplicemente prima di includere qualsiasi std :: header. Un po 'sporco, ma funzionerà finché GCC non lo risolverà (a meno che non si tratti di un comportamento previsto). Il #define non dovrebbe rompere nulla comunque. O in source o -D_GLIBCXX_USE_NANOSLEEP su GCC.

Si potrebbe provare a utilizzare -std = gnu ++ 0x piuttosto che -std = C++ 0x, poiché gnu ++ 0x spesso inserisce elementi come questo.

7

Ulteriori informazioni, in caso aiuta qualcuno:

Non ho bisogno di definire _GLIBCXX_USE_NANOSLEEP in Ubuntu 11.10, gcc 4.6.1, glibc 2.13.

Ma I do do compila con -D_GLIBCXX_USE_NANOSLEEP su Gentoo, gcc 4.6.1, glibc 2.12.2.

Non ho intenzione di compilare il sistema Gentoo per l'aggiornamento di glibc. Almeno non prima del fine settimana;)

+0

stesso problema su porte Mac OSX Mac 4.7.2 gcc con la correzione '-D_GLIBCXX_USE_NANOSLEEP' risolverlo – pyCthon

3

sembra funzionare senza definire su ubuntu 13.04 con gcc version 4.7.3

1

Necessità di definire _GLIBCXX_USE_NANOSLEEP in cima al codice sorgente.

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

O, compilare con i seguenti commamd:

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