2010-12-14 5 views
36

Lorsque je tente de compiler ce programme simple:std :: this_thread :: sleep_for() et GCC

#include<thread> 

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

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

avec la version gcc 4.4.3 sur Ubuntu 10.04 (32 bits):

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

Je reçois:

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

J'ai regardé dans l'en-tête 'thread'.
sleep_for() est protégé par _GLIBCXX_USE_NANOSLEEP

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

Pourquoi _GLIBCXX_USE_NANOSLEEP pas défini?
Comment obtenir cet exemple pour compiler?


Mise à jour le 17 septembre 2012 (jogojapan): Je suis tombé sur ce même problème aujourd'hui, en utilisant GCC 4.7.1. Je me demande s'il y a des nouvelles sur la façon de l'éviter, autrement qu'en définissant _GLIBCXX_USE_NANOSLEEP. J'ai essayé d'utiliser -std=gnu11, mais en vain.

Il y a aussi un vieux rapport de bogue non résolu pour GCC 4.4: https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145


Mise à jour le 19 octobre 2012 (jogojapan): La question a été expliqué et résolu par Jonathan Wakely comme anwer à cette question: What is _GLIBCXX_USE_NANOSLEEP all about? Ceci est particulièrement pertinent pour quiconque construit GCC lui-même au lieu d'utiliser un ensemble prêt à l'emploi.

Répondre

26

Confirmé que cela ne fonctionne pas ici aussi. (Instantané GCC 4.6 récent).

Vous pourriez faire l'évident et simplement le définir avant d'inclure des en-têtes std ::. Un peu sale mais fonctionnera jusqu'à ce que GCC le corrige (à moins que ce soit un comportement intentionnel). Le #define ne devrait rien casser de toute façon. Soit dans la source, soit dans l'indicateur -D_GLIBCXX_USE_NANOSLEEP de GCC.

Vous pouvez essayer d'utiliser -std = gnu ++ 0x plutôt que -std = C++ 0x, puisque gnu ++ 0x tire souvent dans ce genre de choses.

7

Informations supplémentaires, au cas où il aide quelqu'un:

Je ne pas besoin de définir _GLIBCXX_USE_NANOSLEEP dans Ubuntu 11.10, gcc 4.6.1, glibc 2.13.

Mais je ne besoin de compiler avec -D_GLIBCXX_USE_NANOSLEEP sur Gentoo, gcc 4.6.1, glibc 2.12.2.

Je ne vais pas compiler le système Gentoo pour mettre à jour la glibc. Au moins pas avant le week-end;)

+0

même problème sur les ports mac osx mac 4.7.2 gcc avec le correctif '-D_GLIBCXX_USE_NANOSLEEP' résoudre – pyCthon

3

semble fonctionner sans définir sur ubuntu 13.04 en utilisant la version gcc 4.7.3

1

Nécessité de définir _GLIBCXX_USE_NANOSLEEP au-dessus du code source.

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

OU, Compile avec commamd suivant:

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