Wyjątki na granicy binarnej
Wiem, że to pytanie zostało zadane dość często, jednak nie mogę znaleźć rozwiązania mojego problemu.
Mam następującą sytuację:
A
/ \
/ \
B <-- C
A to biblioteka współdzielona, która zawiera klasęEException
Połączenie B i C z AC to także biblioteka współdzielonaB dynamicznie ładuje C w czasie wykonywaniaW pewnym momencie C zgłasza wystąpienieEException
:
void doSometing() {
throw EException("test-message");
}
wB
Chciałbym złapać ten wyjątek:
try {
doSomething();
} catch (const EException& ex) {
// Not reached
} catch (...) {
// Not reached
}
ale jak wspomniano w kodzie, żadna z klauzul catch nie jest wywoływana. Zamiast tego wątek, w którym ten kod jest wykonywany, zostaje przerwany.
Próbowałem następujących rzeczy:
Atrybut widocznościEException
jest ustawiany na „default” podczas kompilacji ATheEException
plik nagłówkowy zawiera tylko deklaracjeUżywam opcji linkera-fvisibility=hidden
w A, B i CUżywam opcji linkera-E
w CZa pomocąnm
Dostaję zaA
:
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
dlaB
:
U EException::EException(QString const&)
U EException::~EException()
<...>
0000000000726f60 V typeinfo for EException
i dlaC
:
U EException::EException(QString const&)
U EException::~EException()
<...>
U typeinfo for EException
Czy problem może być takiB
używa własnej informacji o typieEException
, podczasC
korzysta z dostarczonego przezA
? Jak to naprawić?
Moje środowisko:
gcc 4.6.3 na x86_64-linux-gnuużywając QtDziękuję za pomoc!