我有一个像 PardisoSolver.h 这样的常规 C++ 类:
#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 中有实现。在这里,我有一个 C 函数的附加声明以及类的实现:
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 函数?据我所知,它不能是类(class)的成员,所以这应该是调用它的方式。感谢您的帮助。
最佳答案
所有这些都表明您的程序设计需要改进。首先,你的“模块”(类+其他东西)应该只有一个接口(interface)。你不应该有“一个类,然后是一些”,这没有任何意义。与该类的功能相关的所有功能都应包含在该类中。所有不相关的内容都应移至程序的另一部分。
弄清楚这一点后,您需要弄清楚编程语言。这是 C 还是 C++?它是 C++ 和 C 中的调用者吗?似乎是后者。如果是这样,您需要以某种方式将两种语言分开。举个例子:在 Windows 中,您可以将 C++ 类放在一个 DLL 中,并带有一个可以从 C 调用的接口(interface)。
最后,你应该考虑让一个函数以 17 个指针作为参数是否有意义。这些参数根本不相关吗?可以将它们分组到结构/类中吗?或者这可能只是一个不必要的复杂怪物函数,可以拆分成几个不同的函数。
关于c++ - 在 C++ 中绑定(bind) C 函数( undefined reference ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13526994/