流氓缺少c ++符号 - 调试策略?

时间:2012-04-27 21:58:17

标签: c++ python linker

我正在为LAMMPS构建/使用python模块,LAMMPS是开源分子动力学模拟器(project homesource)。

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

我丢失的特定符号是C ++错位名称__ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE,可能是MPI_Win_set_errhandler(或者某个命名空间/面向对象,具有类似名称)。对于上下文,我使用python/setup_serial.py文件编译它,它应该使用虚拟MPI接口构建,并且根本不应该引用任何真正的MPI符号;所以这是一个在某个地方悄悄流淌的流氓参考。我也对源进行了一些修改,但是当我禁用所有更改时,我得到了同样的错误。

我的问题是,找出动态库中引用符号的位置给出这种错误的最佳调试策略是什么?到目前为止,我已尝试在源代码中搜索引用到这个符号(或名称的一部分),但我没有找到任何实例(事实上,唯一的结果是来自python构建过程的二进制文件,我导入的文件库。)

我的下一步是以某种方式搜索二进制文件,我猜,但我不知道从哪里开始(或其他策略)。

1 个答案:

答案 0 :(得分: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

然后开始逛逛,看看它是否在某处定义。