オープンソースの分子動力学シミュレーターであるLAMMPSのpythonモジュールを構築/使用しています(プロジェクトホーム、ソース)。
Python モジュールは、C++ アプリケーションをライブラリとしてコンパイルし、CDLL/ctypes を使用して C 関数インターフェイスを呼び出すことによって機能します。Python で関数を呼び出すとCDLL()
、OS がライブラリ自体で見つけられず、他の利用可能なライブラリからロードできない不足しているシンボルがある場合、ロードは失敗します。
__ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE
欠落している特定のシンボルは、おそらくMPI_Win_set_errhandler (または同様の名前を持つ名前空間/オブジェクト指向の同等物)である C++マングルされた name です。コンテキストのために、ファイルを使用してコンパイルしましたpython/setup_serial.py
。これは、ダミーの MPI インターフェイスでビルドする必要があり、実際の MPI シンボルをまったく参照しないでください。したがって、これはどこかに忍び込んだ不正な参照です。ソースにもいくつかの変更を加えましたが、すべての変更を無効にすると同じエラーが発生します。
私の質問は、この種のエラーを発生させている動的ライブラリでシンボルが参照されている場所を見つけるための最良のデバッグ戦略は何ですか? これまでのところ、このシンボル (または名前の一部) への参照についてソースを検索してみましたが、インスタンスが見つかりません (実際、唯一の結果は、python ビルド プロセスからのバイナリ ファイルです。ライブラリのインポートに問題があります。)
私の次のステップは、何らかの方法でバイナリ内を検索することだと思いますが、どこから始めればよいか (または他の戦略) がわかりません。