Мой проект состоит из следующего:
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.
Что я пробовал:
-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, но, должно быть, чего-то не хватает ..
Любой совет?
РЕДАКТИРОВАТЬ
На самом деле, это не было проблемой динамической библиотеки. Я должен был немедленно попытаться скомпилировать его статически — и сэкономить много времени, потому что поведение на самом деле не изменится. (См. Ответ)
Наконец-то я разобрался с вопросом … Д’Ох.
Не то чтобы исключения были оставлены невостребованными! Призыв к std::terminate
был сделан, когда исключение было выброшено из деструктора, и это не разрешено по умолчанию в C ++ 11. Фактическая проблема, с которой я столкнулся, заключалась в следующем: Деструкторы и нет, кроме — ошибка компилятора позволила мне не знать об ошибке библиотеки …
Других решений пока нет …