4

これが私の問題です:

ダイナミックリンクライブラリとして構築された2つのC++モジュールAとBがあります。Aは、基本的な数学関数とカスタム例外タイプを提供します。Bは、Aを使用する上位レベルのモジュールです。

B :: someFunction()はAから関数を呼び出し、カスタム例外A:MyExceptionFromAをキャッチして、カスタムタイプB:MyExceptionFromBに変換しようとします(モジュールBのユーザーはAの実装の詳細を知る必要がないため) )。

私がC++ドメインに留まっている限り、すべてが正常に機能します。ただし、BoostPythonを介してPythonでB:: someFunction()を公開すると、C++モジュールで例外がキャッチされなくなります。

A:MyExceptionFromAの派生元であるstd :: runtime_errorをキャッチし、typeid(e).name()を呼び出して正しいマングル名を取得できるので、正しい例外がスローされることがわかります。したがって、問題は、このマングルされたシンボルを正しい例外タイプに解決することに起因すると思われます。

このリンクを見つけました。これは、「Pythonは[insular]モデルを使用して拡張モジュールを開くため、拡張モジュールの作成者は他の拡張モジュールが使用している可能性のあるシンボルを知る必要がない」と説明しています。これは問題/解決策の一部であると思われますが、問題を解決する方法を理解するためのシンボル解決について十分に理解していません。

何か案は?

4

1 に答える 1

2

問題の回避策を見つけました。thisとlink textに基づいて、追加することがわかりました

import sys, dl
sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)

私のインクルードが問題を解決する前に、Pythonにライブラリを即時のグローバルモードで強制的に開くように強制します。しかし、代替ソリューションがあれば、それを望んでいます。最初のリンクで述べたように、これが予期せぬ影響を与える可能性があるのではないかと疑っています (名前の衝突が問題になる可能性があることは既に知っています。また、パフォーマンスにも影響を与える可能性があると思われますが、他の副作用はありますか?)

于 2010-08-23T13:19:12.703 に答える