0

我正在为 LAMMPS 构建/使用 python 模块,它是开源分子动力学模拟器(项目主页源代码)。

python 模块通过将 C++ 应用程序编译为库,并使用 CDLL/ctypes 调用 C 函数接口来工作。当您CDLL()在 python 中调用该函数时,如果操作系统在库本身中找不到任何缺失的符号,并且无法从其他可用库加载,则加载失败。

我缺少的特定符号是 C++ 错位名称__ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE,它可能是MPI_Win_set_errhandler(或一些具有类似名称的命名空间/面向对象的等价物)。对于上下文,我使用该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

似乎存在部件升级但未重新编译的情况。第二件事是查看编译器的链接行并查看它包含哪些库。

最后的最后手段是做类似的事情:

readelf -s /path/to/libfoo.so

并开始四处寻找,看看它是否在某个地方定义。

于 2012-04-27T22:03:52.967 回答