【发布时间】: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)
标签: c++ linker-errors symbols nm