У меня есть обычный класс C ++, такой как PardisoSolver.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. Здесь у меня есть дополнительное объявление функции 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 в неправильном месте? Как я понял, он не может быть членом класса, так что это должен быть способ его вызова. Спасибо за помощь.
Все это говорит о том, что дизайн вашей программы нуждается в улучшении. Прежде всего, должен быть только один интерфейс к вашему «модулю» (класс + другие вещи). Вы не должны иметь «класс, а затем и некоторые», это не имеет никакого смысла. Все функции, связанные с функциональностью класса, должны быть включены в этот класс. Все, что не связано, должно быть перенесено в другую часть программы.
Как только вы исправите это, вам нужно уточнить язык программирования. Это C или C ++? Это C ++ с абонентом в C? Вроде бы последний. Если это так, вам нужно как-то разделить два языка. В качестве одного примера: в Windows вы можете поместить класс C ++ в DLL с интерфейсом, который можно вызывать из C.
И, наконец, вы должны подумать, имеет ли смысл иметь функцию, принимающую 17 указателей в качестве параметров. Эти параметры вообще не связаны? Могут ли они быть сгруппированы в структуры / классы? Или, возможно, это просто излишне сложная функция монстра, которую можно разделить на несколько разных.
Других решений пока нет …