Исключение C++ не обнаружено (Qt Project)
Моя проблема заключается в следующем:
Существует общая библиотека Interface.so, основанная на ICE (Internet Communication Engine) и что-то вроде оболочки для часто повторяющихся задач. Одна из этих задач - зарегистрироваться в теме (аналогично идентификатору). В случае, если эта тема еще не существует, ICE выдает исключение с именем NoSuchTopic.
Если я использую Interface.so с автономным приложением Qt, я могу перехватить исключение NoSuchTopic и создать тему в блоке catch (блок catch находится в Interface.so). Но я хочу сделать то же самое в плагине для симулятора полета, который сам по себе является общим объектом, и здесь исключение не перехватывается предыдущим упомянутым блоком перехвата в Interface.so. Вместо этого симулятор полета вылетает, заявляя
terminate called after throwing an instance of 'IceStorm::NoSuchTopic'
nm -C -D говорит, что 'IceStorm::NoSuchTopic' не определен в Interface.so. Это нормально? Или должна быть ссылка, где найти определение? Я уже добавил запись для libIceStorm.so (libs += -lIceStorm), где определяется IceStorm:: NoSuchTopic (в соответствии с nm), но это ничего не меняет!
Я также пробовал '-Wl,-E', но я не знаю, правильно ли я установил эту опцию в Qt Creator. Поможет ли это вообще?
Буду благодарен за каждый намек.
2 ответа
Когда я сталкивался с этой проблемой раньше, обычно это связано с отсутствием информации о типе.
Вы можете часто ловить исключение с try {} catch (...) {}
Блок, как это перехватывает исключения, даже если информация о типе отсутствует, но это не особенно полезно!
Это часто является проблемой, если в общей библиотеке скрыты символы, см. Статью о видимости GCC, особенно раздел "Проблемы с исключениями C++ (пожалуйста, прочитайте!)".
Этот вопрос рекомендует использовать дополнительные флаги.
Иногда чистая перестройка исправит ситуацию, если что-то будет построено на старой версии библиотеки. Если чистая перестройка устраняет проблему, проверьте правильность сценария сборки.
Похоже, что предыдущая версия использовала флаг "без исключений" при сборке из исходного кода. Это добавляет много времени на сборку, поэтому многие люди оставляют его.