我正在为 LAMMPS 构建/使用 python 模块,它是开源分子动力学模拟器(项目主页,源代码)。
python 模块通过将 C++ 应用程序编译为库,并使用 CDLL/ctypes 调用 C 函数接口来工作。当您CDLL()
在 python 中调用该函数时,如果操作系统在库本身中找不到任何缺失的符号,并且无法从其他可用库加载,则加载失败。
我缺少的特定符号是 C++ 错位名称__ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE
,它可能是MPI_Win_set_errhandler(或一些具有类似名称的命名空间/面向对象的等价物)。对于上下文,我使用该python/setup_serial.py
文件编译了它,该文件应该使用虚拟 MPI 接口构建,并且根本不应该引用任何真正的 MPI 符号;所以这是一个潜入某处的流氓参考。我还对源代码进行了一些修改,但是当我禁用所有更改时,我得到了同样的错误。
我的问题是,找出在动态库中引用符号的位置给出这种错误的最佳调试策略是什么?到目前为止,我已经尝试在源代码中搜索对这个符号(或名称的一部分)的引用,但我没有找到任何实例(事实上,唯一的结果是来自 python 构建过程的二进制文件,库我在导入时遇到问题。)
我想我的下一步是以某种方式在二进制文件中搜索,但我不知道从哪里开始(或其他一些策略)。