GCC 4.8.1, C ++ 11, общие библиотеки и проблемы с обработкой исключений

Мой проект состоит из следующего:

  • моя программа, написанная в основном на C ++ 11 (поэтому нецелесообразно пытаться скомпилировать ее в режиме C ++ 03)
  • общая библиотека (https://github.com/SOCI/soci), скомпилированный тем же компилятором

SOCI выдает исключения, которые мне нужно отлавливать в моем коде. Раньше он работал с GCC4.7.3, но теперь я перешел на GCC4.8.1, это больше не так: исключение падает через все обработчики (включая catch(...)) и вызывает прекращение:

terminate called after throwing an instance of 'soci::mysql_soci_error'
what():  Table 'brphrprhprh' doesn't exist
The program has unexpectedly finished.

Что я пробовал:

  • выбрасывая то же исключение из моего кода (около проблемной точки): оно попадает в ловушку с правильным обработчиком;
  • перекомпилировать SOCI с -std=c++11: нет разницы
  • добавление __attribute__((visibility("default"))) к классу исключений: без разницы
  • возиться с -u вариант для typeinfoсвязанные символы: нет различий в поведении, символы отображаются как неопределенные в nm выход. Обратите внимание, что без -uнет вообще

    $ nm -D -C myprogram | grep soci | grep error
    U soci::soci_error::soci_error(std::string const&)
    000000000044013a W soci::soci_error::~soci_error()
    0000000000440124 W soci::soci_error::~soci_error()
    0000000000440124 W soci::soci_error::~soci_error()
    00000000004c43b0 V typeinfo for soci::soci_error
    U typeinfo for soci::mysql_soci_error
    00000000004c43d0 V typeinfo name for soci::soci_error
    U typeinfo name for soci::mysql_soci_error
    00000000004c60c0 V vtable for soci::soci_error
    U vtable for soci::mysql_soci_error
    

Я тоже читаю http://gcc.gnu.org/wiki/Visibility, но, должно быть, чего-то не хватает ..

Любой совет?


РЕДАКТИРОВАТЬ

На самом деле, это не было проблемой динамической библиотеки. Я должен был немедленно попытаться скомпилировать его статически — и сэкономить много времени, потому что поведение на самом деле не изменится. (См. Ответ)

4

Решение

Наконец-то я разобрался с вопросом … Д’Ох.

Не то чтобы исключения были оставлены невостребованными! Призыв к std::terminate был сделан, когда исключение было выброшено из деструктора, и это не разрешено по умолчанию в C ++ 11. Фактическая проблема, с которой я столкнулся, заключалась в следующем: Деструкторы и нет, кроме — ошибка компилятора позволила мне не знать об ошибке библиотеки …

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]