2010-03-11 12 views
6

Il mio progetto contiene una libreria condivisa e un client exe. Ho scoperto che la mia classe di eccezione generata dalla libreria non viene catturata dal blocco catch del client e il programma termina con il messaggio "termina dopo aver lanciato un'istanza di ...". Continuando a giocare con il progetto, ho scoperto che nessuna eccezione di alcun tipo non viene catturata. Ad esempio, questa cattura non funziona: messaggioLe eccezioni non vengono rilevate nel programma GCC

 
    try 
    { 
     m_pSerialPort = new boost::asio::serial_port(m_IoService, "non-existing-port"); 
    } 
    catch(const boost::system::system_error& e) 
    { 
     // ... 
    } 

Errore:

 
terminate called after throwing an instance of 
'boost::exception_detail::clone_impl 
<boost::exception_detail::error_info_injector 
<boost::system::system_error> >' 
    what(): No such file or directory 

versione GCC 4.4.1 è, il sistema operativo Linux. Lo stesso codice è in esecuzione correttamente in Windows, MSVC. Quale motivo può impedire al programma GCC di rilevare correttamente le eccezioni?

+0

Potrebbe gentilmente postare il Makefile in modo che possiamo vedere quali argomenti stai passando a gcc? È possibile passare argomenti che disabilitano le eccezioni. –

+0

Informazioni aggiuntive: quando aggiungo questo codice: prova {throw 1;} catch (int) {} all'eseguibile del client, tutto è OK. Ma lo stesso codice nella libreria condivisa dà: terminare chiamato dopo aver lanciato un'istanza di "int" –

+0

Compilatore appariscente: domanda tecnica. Come posso pubblicare Makefile qui? Il commento è limitato dalla lunghezza e non consente alcuna formattazione. –

risposta

8

Sia il client .exe che la libreria condivisa devono essere collegati con libgcc per poter attraversare i confini delle librerie condivise. Per il manuale di GCC:

... se si suppone che una libreria o principale eseguibile per lanciare o intercettare le eccezioni, è necessario collegarlo con il G ++ o il driver GCJ, a seconda dei casi per le lingue utilizzate nel programma, o usando l'opzione -shared-libgcc, in modo tale che sia collegato con la libgcc condivisa.

+0

Basta leggere questo posto nel manuale GCC :) Sto cercando di collegare staticamente le librerie di terze parti, sembra che ho bisogno di imparare meglio questo problema. Il programma sta funzionando ora, grazie. –

+0

È possibile eseguire il collegamento alle librerie di terze parti in modo statico, basta assicurarsi che le librerie di terze parti si colleghino dinamicamente a libgcc. Quindi avrai una sola istanza di libgcc nel tuo processo. – karunski

Problemi correlati