Я знаю, этот вопрос задавался довольно часто, однако я не могу найти решение для своей проблемы.
У меня следующая ситуация:
A
/ \
/ \
B <-- C
- A - это общая библиотека, которая содержит класс
EException
- Ссылка B и C на A
- C также является общей библиотекой
- B динамически загружает C во время выполнения
В какой-то момент C выдает экземпляр EException
:
void doSometing() {
throw EException("test-message");
}
in B
Я хотел бы поймать это исключение:
try {
doSomething();
} catch (const EException& ex) {
// Not reached
} catch (...) {
// Not reached
}
но, как указано в коде, ни один из предложений catch не вызван. Вместо этого поток, этот код выполняется, прерывается.
Я пробовал следующие вещи:
- При компиляции A атрибут видимости
EException
устанавливается как "по умолчанию",
Заголовочный файл EException
содержит только декларации
Я использую опцию компоновщика -fvisibility=hidden
в A, B и C
Я использую опцию компоновщика -E
в C
Используя 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
использует свой собственный типinfo EException
, а C
использует тот, который предоставляется A
? Как я могу это исправить?
Моя среда:
- gcc 4.6.3 на x86_64-linux-gnu
- с помощью Qt
Благодарим за помощь!