2012-05-03 36 views
0

残念ながら、私はこのためのソースコードを投稿することはできませんが、私は可能な限りそれを設定しようとします。PythonモジュールとC++ランタイム型の不一致?

私は、dynamic_castが派生クラス型にキャストできない場合があり、成功する必要がある(つまり、インスタンスの実際の型がわかります)場合があります。 また、ヒープ割り当てオブジェクトのtypeidは、スタック割り当てオブジェクトのtypeidと等しくありません!! IE、

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

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

+0

問題を再現する最小限の例を作成しようとしましたか? –

+0

これは少し曖昧です。あなたの例は 'typeid'演算子を扱いますが、' Foo'の定義がなければ 'class Foo {};のように比較がfalseに評価される理由を判断する方法がありません。続いて、これとほとんど関係のない共有ライブラリとPythonをリンクする際の問題について説明します。 – AJG85

+0

@ AJG85 - 残念ながら私はソースコードを含めることができないので少し曖昧です。私は、単純な実行可能ファイルにリンクされているとすべてがうまく動作するため、Pythonとのリンクが適切でなければならないと思います。しかし、私は誰かが正しい方向に私を指し示すいくつかの知識を持っていることを期待しているので、間接的であっても、どんな提案も非常に便利です。 – user1372826

答えて

0

これは、拡張モジュールをRTLD_LOCALでロードするPythonによって引き起こされます。解決策は、代わりにRTLD_GLOBALでPythonにロードすることです(OPのコメントを参照)。