この質問は何度も聞かれていますが、問題の解決策が見つかりません。
次のような状況があります。
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 句も呼び出されません。代わりに、このコードが実行されるスレッドが中止されます。
私は次のことを試しました:
- の可視性属性は、
EExceptionA のコンパイル時に「デフォルト」に設定されます。 EExceptionヘッダー ファイルには宣言のみが含まれます-fvisibility=hiddenA、B、C でリンカー オプションを使用しています-ECでリンカー オプションを使用しています
nmI 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 を使用するという問題はありますか? どうすればこれを修正できますか?EExceptionCA
私の環境:
- x86_64-linux-gnu 上の gcc 4.6.3
- Qtを使用して
ご協力ありがとうございました!