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 classeEExceptionLink B e C contra AC é uma biblioteca compartilhada, bemB carrega dinamicamente C em tempo de execução

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

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

Obrigado pela ajuda!

questionAnswers(5)

yourAnswerToTheQuestion