はじめに
長い質問を前もってお詫び申し上げます。できる限り短くしていますが、残念ながらそれほど短くはありません。
設定
A と B の 2 つのインターフェイスを定義しました。
class A // An interface
{
public:
virtual ~A() {}
virtual void whatever_A()=0;
};
class B // Another interface
{
public:
virtual ~B() {}
virtual void whatever_B()=0;
};
次に、クラス C のオブジェクトを構築し、A と B の両方を実装してから、それらの A インターフェイスへのポインタを渡す共有ライブラリ「testc」があります。
class C: public A, public B
{
public:
C();
~C();
virtual void whatever_A();
virtual void whatever_B();
};
A* create()
{
return new C();
}
最後に、2 番目の共有ライブラリ「testd」があります。これは、A*
入力として を受け取り、それを にキャストしようとしますB*
。dynamic_cast
void process(A* a)
{
B* b = dynamic_cast<B*>(a);
if(b)
b->whatever_B();
else
printf("Failed!\n");
}
最後に、メイン アプリケーションA*
があり、ライブラリ間で 'sを渡します。
A* a = create();
process(a);
質問
「testc」および「testd」ライブラリにリンクしてメイン アプリケーションをビルドすると、すべてが期待どおりに機能します。ただし、「testc」および「testd」に対してリンクしないようにメイン アプリケーションを変更し、代わりにdlopen
/を使用して実行時にロードするとdlsym
、dynamic_cast
失敗します。
私はなぜなのか理解していない。手がかりはありますか?
追加情報
- gcc 4.4.1、libc6 2.10.1 (Ubuntu 9.10) でテスト済み
- サンプルコードが利用可能