我知道,这个问题已经被问过很多次了,但是我找不到我的问题的解决方案。
我有以下情况:
A
/ \
/ \
B <-- C
- A 是一个包含类的共享库
EException
- B 和 C 链接 A
- C也是一个共享库
- B 在运行时动态加载 C
在某些时候 C 抛出一个实例EException
:
void doSometing() {
throw EException("test-message");
}
在B
我想捕捉这个异常:
try {
doSomething();
} catch (const EException& ex) {
// Not reached
} catch (...) {
// Not reached
}
但正如代码中所提到的,没有一个 catch 子句被调用。相反,执行此代码的线程被中止。
我尝试了以下事情:
- 的可见性属性
EException
在编译 A 时设置为“默认” - 头
EException
文件只包含声明 - 我
-fvisibility=hidden
在 A、B 和 C 中使用链接器选项 - 我
-E
在 C 中使用链接器选项
使用nm
我得到A
:
0000000000066260 T EException::EException(QString const&)
0000000000066306 T EException::EException(EException const&)
00000000000661d0 T EException::EException()
0000000000066260 T EException::EException(QString const&)
0000000000066306 T EException::EException(EException const&)
00000000000661d0 T EException::EException()
00000000000664de T EException::~EException()
000000000006641e T EException::~EException()
000000000006641e T EException::~EException()
00000000000663b6 T EException::operator=(EException const&)
<...>
000000000028de40 V typeinfo for EException
000000000028dd80 V typeinfo for EException*
000000000007342b V typeinfo name for EException
0000000000072ab7 V typeinfo name for EException*
000000000028de00 V vtable for EException
对于B
:
U EException::EException(QString const&)
U EException::~EException()
<...>
0000000000726f60 V typeinfo for EException
和C
:
U EException::EException(QString const&)
U EException::~EException()
<...>
U typeinfo for EException
问题可能是,它B
使用自己的 typeinfo EException
,而C
使用 提供的A
?我将如何解决这个问题?
我的环境:
- x86_64-linux-gnu 上的 gcc 4.6.3
- 使用 Qt
谢谢您的帮助!