我的项目包括以下内容:
- 我的程序,主要使用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.
我尝试过:
- throwing the same exception from my code (near the trouble point): it gets caught with the right handler;
- recompiling SOCI with
-std=c++11
: no difference - adding
__attribute__((visibility("default")))
to the exception class: no difference fiddling with the
-u
option fortypeinfo
-related symbols: no difference in behaviour, symbols appear as undefined innm
output. Note that without-u
's there are none at all:$ 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
有什么建议吗?
编辑 事实上,那并不是任何动态库问题。我应该立即尝试静态编译它 —— 这样做不会真正改变行为,但可以节省很多时间。 (查看答案)
dlopen
加载库? - n. m.