2010-03-11 13 views
6

Mi proyecto contiene una biblioteca compartida y un cliente exe. Descubrí que mi clase de excepción lanzada desde la biblioteca no es atrapada por el bloque catch del cliente, y el programa finaliza con el mensaje "terminar llamado después de lanzar una instancia de ...". Siguiendo jugando con el proyecto, descubrí que no se detecta ninguna excepción de ningún tipo. Por ejemplo, esta captura no funciona: Mensaje deLas excepciones no se detectan en el programa GCC

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

error:

 
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 

versión de GCC es 4.4.1, sistema operativo Linux. El mismo código se ejecuta correctamente en Windows, MSVC. ¿Qué razón puede evitar que el programa GCC capte las excepciones correctamente?

+0

¿Podría publicar amablemente el Makefile para que podamos ver qué argumentos está pasando a gcc? Puede pasar argumentos que deshabiliten excepciones. –

+0

Información adicional: cuando agregue este código: pruebe {throw 1;} catch (int) {} con el ejecutable del cliente, todo está bien. Pero el mismo código en la biblioteca compartida da: terminate called después de lanzar una instancia de 'int' –

+0

Conspicuous Compiler: pregunta técnica. ¿Cómo puedo publicar Makefile aquí? El comentario está restringido por la longitud y no permite ningún formato. –

Respuesta

8

Tanto el cliente .exe como la biblioteca compartida deben estar vinculados con libgcc para poder cruzar los límites de la biblioteca compartida. Según el manual de GCC:

... si una biblioteca o ejecutable principal se supone que tirar o coger excepciones, debe vincularlo con el G ++ o controlador CGPJ, según sea apropiado para las lenguas utilizadas en el programa, o utilizando la opción -shared-libgcc, de modo que esté vinculada con el libgcc compartido.

+0

Acabo de leer este lugar en el manual de GCC :) Estoy tratando de vincular estáticamente bibliotecas de terceros, parece que necesito aprender este tema mejor. El programa está funcionando ahora, gracias. –

+0

Puede vincular las bibliotecas de terceros estáticamente, solo asegúrese de que las bibliotecas de terceros se vinculen a libgcc de forma dinámica. Por lo tanto, solo tendrá una instancia de libgcc en su proceso. – karunski

Cuestiones relacionadas