Exceções através do limite binário
Eu sei, essa pergunta já foi feita algumas vezes, mas não consigo encontrar uma solução para o meu problema.
Eu tenho a seguinte situação:
A
/ \
/ \
B <-- C
A é uma biblioteca compartilhada que contém a classeEException
Link B e C contra AC é uma biblioteca compartilhada, bemB carrega dinamicamente C em tempo de execuçãoEm algum momento C lança uma instância deEException
:
void doSometing() {
throw EException("test-message");
}
emB
Eu gostaria de pegar essa exceção:
try {
doSomething();
} catch (const EException& ex) {
// Not reached
} catch (...) {
// Not reached
}
mas, como mencionado no código, nenhuma das cláusulas catch é chamada. Em vez disso, o segmento, esse código é executado, é abortado.
Eu tentei as seguintes coisas:
O atributo de visibilidade deEException
está definido como "padrão" ao compilaroEException
arquivo de cabeçalho contém apenas declaraçõesEu estou usando a opção de vinculador-fvisibility=hidden
em A, B e CEu estou usando a opção de vinculador-E
em CUsandonm
Eu ganho porA
:
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
paraB
:
U EException::EException(QString const&)
U EException::~EException()
<...>
0000000000726f60 V typeinfo for EException
e paraC
:
U EException::EException(QString const&)
U EException::~EException()
<...>
U typeinfo for EException
O problema poderia ser queB
usa seu próprio tipo de informaçãoEException
, enquantoC
usa o fornecido porA
? Como eu consertaria isso?
Meu ambiente:
gcc 4.6.3 em x86_64-linux-gnuusando QtObrigado pela ajuda!