2010-03-25 18 views
15

Ich kompilierte & installiert gcc4.4 mit Macports.Std :: Thread Fehler (Thread nicht Mitglied der Std)

Wenn ich versuche, mit zu kompilieren -> g ++ -g -Wall -ansi -pthread -std = C++ 0x main.cpp ...:

#include <thread> 
... 
    std::thread t(handle); 
    t.join(); 
.... 

Der Compiler liefert:

cserver.cpp: In member function 'int CServer::run()': 
cserver.cpp:48: error: 'thread' is not a member of 'std' 
cserver.cpp:48: error: expected ';' before 't' 
cserver.cpp:49: error: 't' was not declared in this scope 

Aber std::cout <<... kompiliert fein ..

Kann mir jemand helfen?

+0

Wenn Sie im Thread-Header aussehen, scheint es, dass die Klasse existiert nur '#if defined (_GLIBCXX_HAS_GTHREADS) && definiert (_GLIBCXX_USE_C99_STDINT_TR1)' . Ich bin mir nicht sicher, was Sie tun müssen, um diese zu definieren. – UncleBens

+0

@UncleBens: Ich glaube, diese sind direkt definiert durch -Pthread und -std = C++ 0x. Das Auslassen von -pthread verursacht einen seg-Fehler: http://gcc.gnu.org/ml/gcc-help/2009-04/msg00208.html –

+0

Nur das neueste Update: MacPorts gcc 4.7.0 unterstützt/kompiliert std :: thread, während 4.6.3 nicht. –

Antwort

5

Drop -ansi bedeutet es -std = C++ 98, die Sie offensichtlich nicht wollen. Es bewirkt auch, dass das Makro __STRICT_ANSI__ definiert wird, und dies kann das Verhalten der Header ändern, z. durch Deaktivieren der C++ 0x-Unterstützung.

+0

Der Makroname hat tatsächlich zwei Unterstriche am Ende, aber SO interpretiert es falsch als Formatierung, wenn ich es richtig schreibe. – Tronic

+0

Gut darauf hingewiesen, habe ich es entfernt, aber es gibt mir immer noch den gleichen Fehler .. Ich versuchte mit gcc4.4 und gcc4.5 beta ... Dies ist frustrierend. – luis

+0

behoben das fehlende Unterstrich Problem. –

13

gcc nicht vollständig std :: thread noch unterstützen:

http://gcc.gnu.org/projects/cxx0x.html

http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html

Verwenden boost::thread in der Zwischenzeit.

bearbeiten

Obwohl die kompilierte folgenden und lief für mich mit gcc 4.4.3 fein:

#include <thread> 
#include <iostream> 

struct F 
{ 
    void operator()() const 
    { 
    std::cout<<"Printing from another thread"<<std::endl; 
    } 
}; 

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

    return 0; 
} 

Zusammengestellt mit

 
g++ -Wall -g -std=c++0x -pthread main.cpp 

Ausgabe von a.out:

 
Printing from another thread 

Können Sie den vollständigen Code angeben? Vielleicht lauert da ein seltsames Problem in diesen ... s?

+0

Ich habe versucht, Ihren Code und ich bekomme den gleichen Fehler ... Kann dies OSX bezogen werden? Oder vielleicht etwas, das mit der GCC-Installation von MacPorts nicht stimmt? – luis

+1

Es kann sein, dass MacPorts die C++ 0x-Funktionalität nicht vollständig unterstützt? Haben Sie die Ausgabe von Ihrem GCC-Konfigurationsskript? Hier ist ein Mac-Benutzer, für den configure angegeben hat, dass std :: thread nicht unterstützt wird: (http://www.mail-archive.com/[email protected]/msg00973.html) –

0

Nun habe ich auf Ubuntu mit GCC 4.4.1 versucht und es funktioniert wie ein Charme. Das Problem ist Mac OS X spezifisch, jetzt müssen nur herausfinden, warum ...

1

Ich hatte das gleiche Problem auf Windows mit MinGW. Ich fand Wrapper-Klassen für in auf GitHub mingw-std-threads Einschließlich mingw.mutex.h, mingw.thread.h Dateien zu globalen MinGW-Verzeichnis behoben dieses Problem. Alles, was ich tun musste, ist Header-Datei und mein Code geblieben sind die gleichen

#include "mingw.thread.h" 

... 
std::thread t(handle); 
... 
+0

Prost für das. Hat mich verrückt gemacht. Ihre Antwort war etwas verwirrend, wo Sie auf das globale MinGW-Verzeichnis verwiesen haben. Ich musste die Dateien im Projektordner ablegen, wo alle anderen .h-Dateien funktionieren sollten ... aber es funktionierte. – CoreyRS

Verwandte Themen