0

オープンソースの分子動力学シミュレーターである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 ビルド プロセスからのバイナリ ファイルです。ライブラリのインポートに問題があります。)

私の次のステップは、何らかの方法でバイナリ内を検索することだと思いますが、どこから始めればよいか (または他の戦略) がわかりません。

4

1 に答える 1

2

c++filtはあなたの友達です

$ c++filt __ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE
MPI::Win::Set_errhandler(MPI::Errhandler const&)

次に、そのライブラリでグーグル検索を実行します http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=512616

パーツはアップグレードされているが、再コンパイルされていない場合があるようです。2つ目は、コンパイラーのリンク行を調べて、どのライブラリーが含まれているかを確認することです。

最後の最後の手段は、次のようなことを行うことです。

readelf -s /path/to/libfoo.so

そして、それがどこかで定義されているかどうかを確認するために、ざっと見て回り始めます。

于 2012-04-27T22:03:52.967 に答える