绑定C++中的C函数(未定义的引用)

Bind C function in C++ (undefined reference)

本文关键字:未定义 引用 函数 C++ 中的 绑定      更新时间:2023-10-16

我有一个像ParisoSolver这样的常规C++类。h:

#ifndef PARDISOSOLVER_H_
#define PARDISOSOLVER_H_
class PardisoSolver {
public:
/* Initializes a new Solver with the given matrix in CSR */
PardisoSolver(
int* ia,
int* ja,
double* a,
int n,
int nja);
virtual ~PardisoSolver();
void setMatrixType(int mtype);
void pardisoSymFactorize();
private:
static int get_nproc(void);
void handle_error(int ierror, int line);
int* ia;        // row indices
int* ja;        // column pointer
double* a;      // non zero values
int n_eq;       // size of matrix
int nja;        // number of non zero elements
bool factorized;
/* PARDISO SETTINGS */
void *pt[64];
int maxfct;
int mnum;
int mtype;
int perm;
int nrhs;
int iparm[64];
int msglvl;
int error;
double   dparm[64];
double dzero;
int izero;
};
#endif /* PARDISOSOLVER_H_ */

另一方面,我有PardisoSolver.cpp中的实现

extern "C" void pardiso     (void   *, int    *,   int *, int *,    int *, int *,
double *, int    *,    int *, int *,   int *, int *,
int *, double *, double *, int *, double *);

现在,当我尝试调用这样的函数时

pardiso (pt, &maxfct, &mnum, &mtype, &phase,
&n_eq, a, ia, ja, &izero, &nrhs,
iparm, &msglvl, &dzero, &dzero, &error,  dparm);

我得到编译错误

PardisoSolver.cpp:94: undefined reference to `pardiso'

其中呼叫在线路94中。我是否在错误的地方声明了C函数?据我所知,它不可能是一个班级的成员,所以应该这样称呼它。谢谢你的帮助。

所有这些都表明您的程序设计需要改进。首先,你的"模块"(类+其他东西)应该只有一个接口。你不应该"先上课,然后上课",这没有任何意义。与类的功能相关的所有函数都应包含在该类中。所有不相关的,都应该移到程序的另一部分。

一旦你弄清楚了这一点,你就需要澄清编程语言。这是C还是C++?是C++和C中的调用者吗?似乎是后者。如果是这样的话,你需要以某种方式将这两种语言分开。举个例子:在Windows中,你可以将C++类放在DLL中,其中有一个可以从C.调用的接口

最后,您应该考虑使用一个以17个指针为参数的函数是否合理。这些参数是否根本不相关?它们可以按结构/类分组吗?或者,这只是一个不必要的复杂怪物函数,可以分为几个不同的函数。