dynamic_cast schlägt bei Verwendung mit dlopen / dlsym fehl
Lassen Sie mich für die lange Frage entschuldigen. Es ist so kurz wie ich es machen könnte, was leider nicht sehr kurz ist.
KonfigurationIch habe zwei Schnittstellen definiert, A und B:
class A // An interface
{
public:
virtual ~A() {}
virtual void whatever_A()=0;
};
class B // Another interface
{
public:
virtual ~B() {}
virtual void whatever_B()=0;
};
Dann habe ich eine gemeinsam genutzte Bibliothek "testc", die Objekte der Klasse C erstellt, sowohl A als auch B implementiert und dann Zeiger auf ihre A-Schnittstelle verteilt:
class C: public A, public B
{
public:
C();
~C();
virtual void whatever_A();
virtual void whatever_B();
};
A* create()
{
return new C();
}
Schließlich habe ich eine zweite gemeinsam genutzte Bibliothek "testd", die eineA*
als Eingabe, und versucht, es zu einem CastB*
mitdynamic_cast
void process(A* a)
{
B* b = dynamic_cast<B*>(a);
if(b)
b->whatever_B();
else
printf("Failed!\n");
}
Schließlich habe ich Hauptantrag, vorbeiA*
zwischen den bibliotheken:
A* a = create();
process(a);
FrageWenn ich meine Hauptanwendung erstelle, die mit den Bibliotheken 'testc' und 'testd' verknüpft ist, funktioniert alles wie erwartet. Wenn ich jedoch die Hauptanwendung so ändere, dass sie nicht mit 'testc' und 'testd' verknüpft, sondern zur Laufzeit mit geladen wirddlopen
/dlsym
, dann ist diedynamic_cast
scheitert.
Ich verstehe nicht warum. Irgendwelche Hinweise?
Zusätzliche InformationGetestet mit gcc 4.4.1, libc6 2.10.1 (Ubuntu 9.10)Beispielcode verfügbar