2012-04-27 54 views
0

我正在构建/使用LAMMPS的python模块,它是开源的分子动力学模拟器(project home,source)。流氓缺少C++符号 - 调试策略?

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

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

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

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

回答

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 

并开始grepping四周,看看它是否某处定义。

+0

链接线非常长,但我已经检查过,它包含指向'src/STUBS /'(相对于项目根目录)下的虚拟C MPI API的链接。我不确定我明白为什么在官方MPI发行版中取消内联函数会破坏API的本地虚拟版本 - 除非我引用了现在已更改的官方MPI头文件。 – tehwalrus 2012-04-27 22:13:27

+0

我检查了我的系统文件夹,并且有一个mpi.h,但它的版本是1.2.8 - 在Debian线程开始出现问题之前,所以即使这覆盖了本地头文件也不应该中断的东西。 – tehwalrus 2012-04-27 22:20:46

+0

唯一需要添加的是你需要在OS X上使用'gobjdump'(在macports的binutils包下),因为readelf是linux-only [见这里](http://stackoverflow.com/questions/3286675/) readelf-like-tool-for-mac-os-x),但除此之外,这是对所需工具的非常好的总结。谢谢! :) – tehwalrus 2012-04-27 22:54:12