Исключения через бинарную границу

Я знаю, этот вопрос задавался довольно часто, но я не могу найти решение своей проблемы.

У меня следующая ситуация:

   A
  / \
 /   \
B <-- C
A - это разделяемая библиотека, которая содержит классEExceptionB и C ссылка против AC также является общей библиотекойB динамически загружает C во время выполнения

В какой-то момент C бросает экземплярEException:

void doSometing() {
    throw EException("test-message");
}

вB Я хотел бы поймать это исключение:

try {
    doSomething();
} catch (const EException& ex) {
    // Not reached
} catch (...) {
    // Not reached
}

Но, как уже упоминалось в коде, ни одно из предложений catch не вызывается. Вместо этого поток, в котором выполняется этот код, прерывается.

Я пробовал следующие вещи:

Атрибут видимостиEException установлен на "по умолчанию" при компиляции ATheEException заголовочный файл содержит только объявления Я использую опцию линкера-fvisibility=hidden в А, В и С Я использую опцию линкера-E в С

С помощью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 использует свою собственную информацию типаEException, в то время какC использует предоставленныйA? Как бы это исправить?

Моя среда:

gcc 4.6.3 на x86_64-linux-gnuusing Qt

Спасибо за помощь

Ответы на вопрос(5)

Ваш ответ на вопрос