2012-05-01 13 views
11

Traté de probar un ejemplo de C + + 11 hilos en Eclipse. Pero me dio este mensaje al ejecutar el programa:¿Cómo hacer que CDT/Eclipse funcione con C + + 11 hilos?

terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted'

Mi sistema: ubuntu + gcc 4.7 Programa

:

#include <iostream> 
#include <thread> 

void worker() 
{ 
    std::cout << "hello from worker" << std::endl; 
} 

int main(int argc, char **argv) 
{ 
    std::thread t(worker); 
    t.join(); 
} 

... y sí, puse -std=c++11 y -pthread dentro C/C++ Build -> Settings -> Tool Settings -> Cross G++ Compiler -> Miscellaneous -> Other Flags .

¿Algún comentario?

+0

Parece extraño poner esas configuraciones en una sección de "compilador cruzado" (pero no conozco Eclipse). El bloqueo es repetible si el indicador '-pthread' no está presente en la línea de comando y tiene otras versiones de libstdC++ instaladas. Por lo tanto, asegúrese de que esa bandera realmente se pase a su compilador – Mat

+0

Esta es una excepción de tiempo de ejecución, por lo que el código se compila correctamente. Todavía no entiendo en qué casos debería ocurrir este mensaje de excepción ... – Klaim

+1

@Klaim: ese error aparece si enlaza con el libstdC++ incorrecto, lo que puede suceder si tiene múltiples versiones instaladas y no pasa '- pthread' (o la instalación de GCC está borrosa) – Mat

Respuesta

10

El problema fue resuelto por el comentario de Jonathan Wakely.

Agregué -pthread a C/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags y el programa funcionó correctamente.

Gracias Jonathan.

+0

Para mí fue '... -> CCC C++ Enlazador -> Varios -> Enlazador flags' – gsamaras

0

Para trabajar C++ 11 std::thread en Eclipse, hay que dar la opción -pthread durante la compilación. Sin embargo, no es suficiente. En mi Ubuntu 14.04, con Eclipse Kepler y g ++ 4.9 a continuación hace que funcione:

  1. clic derecho sobre el proyecto y seleccione 'Propiedades'
  2. Ir a 'C/C++ Build'> 'Configuración'> (pestaña) 'Configuración de la herramienta'
  3. Primero seleccione 'Compilar Cross G ++'> 'Varios'> 'Otros indicadores';
    y añadir después -pthread-std=c++11
  4. Segunda seleccione 'Cruz G ++ Linker'> '' Bibliotecas;
    y añadir pthread (lo que equivale a comando Línea -lpthread)

Por último volver a compilar el proyecto; el error debería irse

También recuerda que si usas, std::thread, entonces su objeto debe ser join() en alguna parte. De lo contrario puede llegar por debajo de error de ejecución:

terminate called without an active exception

1
  1. Ir a Proyecto> Propiedades> C/C++ General> preprocesador incluyen rutas, etc> Proveedores> CDT CCG configuración del compilador Integrados y anexar -std=c++11 al compilador especificaciones.

    También puede hacer esto para todos los proyectos que va a Ventana> Preferencias> C/C++> Crear> Configuración> Descubrimiento-std=c++11 y anexar a los CDT CCG configuración del compilador Integrados especificaciones.

    ${COMMAND} ${FLAGS} -E -P -v -dD -std=c++11 "${INPUTS}" 
    
  2. Propiedades del proyecto> C/C++ Build> Ajustes> Ajustes de herramientas> GCC C++ Compiler> Otros> Otras banderas, añaden -pthread -std=c++11 -Wl,--no-as-needed:

    -c -fmessage-length=0 -pthread -std=c++11 -Wl,--no-as-needed 
    
  3. Propiedades del proyecto> C/C++ Crear> Configuración> Configuración de herramientas> GCC C++ Linker> Misceláneo> Indicadores del enlazador, agregar -pthread -std=c++11 -Wl,--no-as-needed

Cuestiones relacionadas