2012-05-01 13 views
11

Ho provato a testare un esempio di thread C++ 11 in Eclipse. Ma ho ricevuto questo messaggio quando si esegue il programma:Come far funzionare CDT/Eclipse con i thread C++ 11?

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

Il mio sistema: ubuntu + gcc 4.7

Programma:

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

... e sì, ho messo -std=c++11 e -pthread all'interno C/C++ Build -> Settings -> Tool Settings -> Cross G++ Compiler -> Miscellaneous -> Other Flags .

Eventuali commenti?

+0

Sembra strano mettere queste impostazioni in una sezione "cross compilatore" (ma non conosco Eclipse). Il crash è ripetibile se il flag '-pthread' non è presente sulla riga di comando e sono installate altre versioni di libstdC++. Assicurati quindi che il flag venga effettivamente passato al compilatore. – Mat

+0

Questa è un'eccezione di runtime, quindi il codice viene compilato correttamente. Ancora non capisco in quali casi questo messaggio di eccezione dovrebbe verificarsi ... – Klaim

+1

@Klaim: l'errore si verifica se si collega il libstdC++ sbagliato, il che può accadere se si hanno più versioni installate e non si passa '- pthread' (o la tua installazione GCC è borked) – Mat

risposta

10

Il problema è stato risolto dal commento di Jonathan Wakely.

Ho aggiunto -pthread a C/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags e il programma ha funzionato correttamente.

Grazie Jonathan.

+0

Per me era '... -> Linker C++ CCC -> Varie -> Bandiere linker ' – gsamaras

0

Per lavorare con C++ 11 std::thread in Eclipse, è necessario fornire l'opzione -pthread durante la compilazione. Tuttavia, non è sufficiente. Nel mio Ubuntu 14.04, con Eclipse Keplero e g ++ 4.9 di seguito lo fa funzionare:

  1. Fare clic destro sul progetto e selezionare 'Proprietà'
  2. Vai a 'C/C++ build'> 'Impostazioni'> (scheda) 'Impostazioni strumenti'
  3. Prima selezionare 'Cross G ++ Compiler'> 'Varie'> 'Altri flag';
    e aggiungere -pthread dopo -std=c++11
  4. Seconda selezionare 'Croce G ++ Linker'> 'biblioteche';
    e aggiungere pthread (che equivale a Command Line -lpthread)

Infine ricompilare il progetto; l'errore dovrebbe andare.

Ricordare inoltre che se si utilizza, std::thread, il suo oggetto deve essere join() da qualche parte. Altrimenti si può ottenere sotto errore di runtime:

terminate called without an active exception

1
  1. Vai a Progetto> Proprietà> C/C++ Generale> preprocessore percorsi di inclusione, ecc> Provider> CDT GCC Builtin impostazioni del compilatore e aggiungere -std=c++11 al compilatore Specifiche.

    si può anche fare questo per tutti i progetti di andare a Finestra> Preferenze> C/C++> Costruire> Impostazioni> Scoperta e aggiungere -std=c++11 alle CDT GCC Builtin impostazioni del compilatore specifiche.

    ${COMMAND} ${FLAGS} -E -P -v -dD -std=c++11 "${INPUTS}" 
    
  2. Proprietà progetto> C/C++ costruire> Impostazioni> Impostazioni strumento> GCC C++ Compiler> Varie> Altri flag, aggiungono -pthread -std=c++11 -Wl,--no-as-needed:

    -c -fmessage-length=0 -pthread -std=c++11 -Wl,--no-as-needed 
    
  3. Proprietà progetto> C/C++ Build> Impostazioni> Impostazioni strumenti> GCC C++ Linker> Varie> Linker flag, aggiungi -pthread -std=c++11 -Wl,--no-as-needed

    -pthread -std=c++11 -Wl,--no-as-needed