この質問は何度も聞かれていますが、問題の解決策が見つかりません。
次のような状況があります。
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
I get for の使用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を使用して
ご協力ありがとうございました!