2010-03-25 20 views
15

compilé & gcc4.4 instalado utilizando macports.std :: error de subproceso (subproceso no miembro de std)

Cuando intento compilar usando -> g ++ -g -Wall -ansi -pthread -std = C++ 0x main.cpp ...:

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

el compilador devuelve:

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 

Pero std::cout <<... compila bien ...

¿Alguien me puede ayudar?

+0

Si nos fijamos en la cabecera del hilo, parece que la clase sólo existe '#if definidos (_GLIBCXX_HAS_GTHREADS) && definido (_GLIBCXX_USE_C99_STDINT_TR1)' . Aunque no estoy seguro, qué tendrías que hacer para tener esos definidos. – UncleBens

+0

@UncleBens: creo que están directamente definidos por -pthread y -std = C++ 0x. Omitir -pthread provoca un error de segmento: http://gcc.gnu.org/ml/gcc-help/2009-04/msg00208.html –

+0

Solo la última actualización: MacPorts gcc 4.7.0 admite/compila std :: thread, mientras que 4.6.3 no. –

Respuesta

5

Gota -ansi, significa -std = C++ 98, que obviamente no desea. También causa que se defina macro __STRICT_ANSI__ y esto puede cambiar el comportamiento de los encabezados, p. al deshabilitar el soporte de C++ 0x.

+0

El nombre del macro en realidad tiene dos guiones bajos al final, pero SO lo malinterpreta como formato si lo escribo correctamente. – Tronic

+0

Bien señalado, lo eliminé, pero aún así me da el mismo error ... Intenté con gcc4.4 y gcc4.5 beta ... Esto es frustrante. – luis

+0

solucionó el problema de subrayado faltante. –

13

gcc no es totalmente compatible std :: hilo sin embargo:

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

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

Uso boost::thread en el ínterin.

Editar

Aunque la siguiente compilado y funcionó muy bien para mí con gcc 4.4.3:

#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; 
} 

Compilado con

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

salida de a.out:

 
Printing from another thread 

¿Puede proporcionar el código completo? Tal vez hay algún problema oscuro al acecho en esos ... s?

+0

Intenté su código y me sale el mismo error ... ¿Puede ser esto relacionado con OSX? ¿O tal vez algo que no está bien con la instalación de GCC por MacPorts? – luis

+1

Es posible que MacPorts no admita por completo la funcionalidad C++ 0x? ¿Tiene el resultado de su script de configuración de gcc? Aquí hay un usuario de Mac para quien configure especificó que std :: thread no es compatible: (http://www.mail-archive.com/[email protected]/msg00973.html) –

0

Bueno, probé Ubuntu con GCC 4.4.1 y funciona como un encanto. El problema es específico de Mac OS X, ahora solo tiene que averiguar por qué ...

0

¿Estás seguro de que estás comprando el compilador correcto? ¿Tienes gcc_select?

1

Tuve el mismo problema en las ventanas con MinGW. Encontré las clases contenedoras para adentro en github mingw-std-threads Incluyendo mingw.mutex.h, mingw.thread.h archivos en el directorio global MinGW corrigió este problema. Todo lo que tenía que hacer es incluir el archivo de cabecera y mi código mantuvo igual

#include "mingw.thread.h" 

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

Saludos por esto. Me estaba volviendo loco. Su respuesta fue un poco confusa cuando se refirió al directorio global MinGW. Tuve que soltar los archivos en la carpeta del proyecto donde están todos los otros archivos .h para que funcione ... pero funcionó. – CoreyRS

Cuestiones relacionadas