nm 符号名称略有不同
Posted
技术标签:
【中文标题】nm 符号名称略有不同【英文标题】:nm symbol names slightly different 【发布时间】:2018-04-24 21:40:56 【问题描述】:我在一个共享库中有一个未定义的符号名称:
U _ZN5Daetk5Petsc3Sys10catchErrorEj
在应该解决这个问题的共享库中,符号名称的最后一个字符不同:
000000000008c65e T _ZN5Daetk5Petsc3Sys10catchErrorEb
这两个共享库使用相同的堆栈 (gcc-7.3.0) 编译。
为什么会发生这种情况?如何解决?
这里是依赖lib header.h的相关代码。
extern "C"
typedef struct
PyObject_HEAD
Daetk::Petsc::Sys* petscSys;
DaetkPetscSys;
依赖的lib source.cpp。
extern "C"
static PyObject*
DaetkPetscSys_catchError(DaetkPetscSys *self, PyObject *args)
bool error;
if(!PyArg_ParseTuple(args,"b",&error)) return NULL;
return Py_BuildValue("b",self->petscSys->catchError(error));
解析库 header.h(已清理)。
namespace Daetk
namespace Petsc
class Sys
public:
Sys();
virtual ~Sys();
bool catchError(bool error);
;
//Petsc::Daetk
解析库 source.cpp(已清理)。
bool Daetk::Petsc::Sys::catchError(bool error)
using namespace cc;
int thisVal=error;
int result=error;
MPI_Allreduce(&thisVal,&result,1,MPI_INT,MPI_LOR,PETSC_COMM_WORLD);
return result;
【问题讨论】:
调用者中的声明和库中的定义肯定有些不同。 贴出相关代码 向工具c++filt
提供错误名称以了解它们的含义。 catchError
的参数类型好像变了。
'$ c++filt _ZN5Daetk5Petsc3Sys10catchErrorEb Daetk::Petsc::Sys::catchError(bool)
$ c++filt _ZN5Daetk5Petsc3Sys10catchErrorEj Daetk::Petsc::Sys::catchError(unsigned int)
【参考方案1】:
问题是 <stdbool.h>
在 hdf5 中给出了一些奇怪的 _Bool is not a type
问题,当时它的一个标头被包含在 Cython 编译中。作为 hack,我注释掉了 <stdbool.h>
include 并将 bool 重新定义为 unsigned int。这是符号名称不匹配问题的根源。
【讨论】:
以上是关于nm 符号名称略有不同的主要内容,如果未能解决你的问题,请参考以下文章