NM 符号名称略有不同



我在一个共享库中有一个未定义的符号名称:

U _ZN5Daetk5Petsc3Sys10catchErrorEj

在应该解决此问题的共享库中,符号名称的最后一个字符不同:

000000000008c65e T _ZN5Daetk5Petsc3Sys10catchErrorEb

这两个共享库是使用相同的堆栈(gcc-7.3.0)编译的。

为什么会这样?如何解决这个问题?

以下是依赖 lib header.h 的相关代码。

extern "C" {
typedef struct
{
PyObject_HEAD
Daetk::Petsc::Sys* petscSys;
} DaetkPetscSys;
}

依赖库源.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));
}
}

解析库标头.h(已清理)。

namespace Daetk {
namespace Petsc {
class Sys
{  
public:
Sys();
virtual ~Sys();
bool catchError(bool error);
};
} } //Petsc::Daetk

解析库源.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;
}

问题是<stdbool.h>在 hdf5 中给出了一些奇怪的_Bool is not a type问题,当它的一个标头被包含在 Cython 编译中时。作为一个黑客,我注释掉了包含<stdbool.h>并将bool重新定义为无符号int。这是符号名称不匹配问题的根源。

最新更新