0

残念ながら、これのソース コードを投稿することはできませんが、できる限りセットアップを試みます。

dynamic_cast が派生クラス型へのキャストに失敗するケースがあり、成功するはずだとわかっています (つまり、インスタンスの実際の型を知っています)。また、ヒープ割り当てオブジェクトの typeid は、スタック割り当てオブジェクトの typeid と等しくありません!! いえ、

Foo mstack;
Foo*mheap = new Foo();
typeid(mstack) == typeid(*mheap);  // returns FALSE!?

つまり、どこかに RTTI の問題があることは明らかです。クラスの実装 (基本クラスと派生クラスの両方) は 1 つの共有ライブラリにあり、誤動作しているコードは 2 番目の共有ライブラリにあり、Python インタープリターで Python モジュールとして読み込まれます (すべて Linux で、gcc 4 または gcc 4 またはインテル C++ コンパイラ)。両方の共有ライブラリをリンクする単純な小さなテスト実行可能ファイルを作成すると、すべて正常に動作します。共有ライブラリをリンクするときに --export-dynamic を試しましたが、成功しませんでした (実行可能ファイルでの使用を意図しているようです)。誰もがどこを見ればよいかについての指針を持っていますか? この種の問題を引き起こす Python の dlopen() の使用方法に何か特別なものはありますか?

4

1 に答える 1

0

これは、Python が拡張モジュールをRTLD_LOCALでロードしていることが原因であり、解決策は Python に強制的にそれをロードさせることですRTLD_GLOBAL(OP のコメントを参照)。

于 2012-05-12T16:19:20.550 に答える