Исключения не фиксируются в программе GCC - PullRequest
6 голосов
/ 11 марта 2010

Мой проект содержит общую библиотеку и исполняемый клиент. Я обнаружил, что мой собственный класс исключений, выданный из библиотеки, не перехватывается клиентским блоком перехвата, и программа завершается с сообщением «terminate вызывают после выброса экземпляра ...» Продолжая играть с проектом, я обнаружил, что ни одно исключение любого типа не ловится. Например, этот улов не работает:

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

Сообщение об ошибке:

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

Версия GCC 4.4.1, ОС Linux. Тот же код успешно работает в Windows, MSVC. Какая причина может помешать программе GCC правильно перехватывать исключения?

1 Ответ

9 голосов
/ 11 марта 2010

И клиентский .exe, и разделяемая библиотека должны быть связаны с libgcc, чтобы перебросить границы разделяемой библиотеки. Согласно руководству GCC:

... если библиотека или основной исполняемый файл должны генерировать или перехватывать исключения, вы должны связать их с помощью драйвера G ++ или GCJ, в зависимости от языков, используемых в программе, или с помощью опции -shared-libgcc такой, что он связан с общим libgcc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...