Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 流氓失踪c++;符号调试策略?_C++_Python_Linker - Fatal编程技术网

C++ 流氓失踪c++;符号调试策略?

C++ 流氓失踪c++;符号调试策略?,c++,python,linker,C++,Python,Linker,我正在为LAMMPS构建/使用python模块,这是一个开源的分子动力学模拟器(,) Python模块通过编译C++应用程序作为库,使用CDLL/Cype调用C函数接口。在python中调用CDLL()函数时,如果操作系统在库中找不到任何缺少的符号,并且无法从其他可用库中加载,则加载将失败 我所丢失的特定符号是一个C++被忽略的名称:代码>Zn3MPI3WI14StIGrReHeldReNKNS1010ErrHelLeLe,这可能是(或一些名称相似的/面向对象的具有相似名称的等价物)。对于上下

我正在为LAMMPS构建/使用python模块,这是一个开源的分子动力学模拟器(,)

Python模块通过编译C++应用程序作为库,使用CDLL/Cype调用C函数接口。在python中调用

CDLL()
函数时,如果操作系统在库中找不到任何缺少的符号,并且无法从其他可用库中加载,则加载将失败

我所丢失的特定符号是一个C++被忽略的名称:代码>Zn3MPI3WI14StIGrReHeldReNKNS1010ErrHelLeLe</C>,这可能是(或一些名称相似的/面向对象的具有相似名称的等价物)。对于上下文,我已经使用

python/setup\u serial.py
文件编译了它,该文件应该使用虚拟MPI接口构建,并且不应该引用任何真正的MPI符号;所以这是一个流氓参考,悄悄地在某处。我还对源代码进行了一些修改,但当我禁用所有更改时,会出现相同的错误

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

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

c++filt是您的朋友

$ c++filt __ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE
MPI::Win::Set_errhandler(MPI::Errhandler const&)
现在在这个库上做一个快速的谷歌搜索

看起来有一种情况是部件升级了,但没有重新编译。第二件事是查看编译器的链接行,看看它包含哪些库

最后一种手段是采取如下措施:

readelf -s /path/to/libfoo.so

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

链接行非常长,但我已经检查过了,它确实包含了指向虚拟C MPI api的链接,该api位于
src/STUBS/
下(相对于项目根目录)。我不知道为什么在官方MPI发行版中取消内联函数会破坏API的本地虚拟版本-除非我引用的是一个现在已更改的官方MPI头文件。我检查了我的系统文件夹,其中有一个MPI.h,但它适用于1.2.8版-在debian线程出现故障之前,所以即使这覆盖了本地头文件,不应该破坏它。唯一要添加的是,您需要在OS X上使用
gobjdump
(在macports的binutils包下),因为readelf仅适用于linux,但除此之外,这是对所需工具的一个很好的总结。谢谢!)