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ęEExceptionPołączenie B i C z AC to także biblioteka współdzielonaB dynamicznie ładuje C w czasie wykonywania

W 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 C

Za 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 Qt

Dziękuję za pomoc!

questionAnswers(5)

yourAnswerToTheQuestion