Исключения через бинарную границу
Я знаю, этот вопрос задавался довольно часто, но я не могу найти решение своей проблемы.
У меня следующая ситуация:
A
/ \
/ \
B <-- C
A - это разделяемая библиотека, которая содержит классEException
B и 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Спасибо за помощь