Связать функцию C в C ++ (неопределенная ссылка)

У меня есть обычный класс 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 в неправильном месте? Как я понял, он не может быть членом класса, так что это должен быть способ его вызова. Спасибо за помощь.

1

Решение

Все это говорит о том, что дизайн вашей программы нуждается в улучшении. Прежде всего, должен быть только один интерфейс к вашему «модулю» (класс + другие вещи). Вы не должны иметь «класс, а затем и некоторые», это не имеет никакого смысла. Все функции, связанные с функциональностью класса, должны быть включены в этот класс. Все, что не связано, должно быть перенесено в другую часть программы.

Как только вы исправите это, вам нужно уточнить язык программирования. Это C или C ++? Это C ++ с абонентом в C? Вроде бы последний. Если это так, вам нужно как-то разделить два языка. В качестве одного примера: в Windows вы можете поместить класс C ++ в DLL с интерфейсом, который можно вызывать из C.

И, наконец, вы должны подумать, имеет ли смысл иметь функцию, принимающую 17 указателей в качестве параметров. Эти параметры вообще не связаны? Могут ли они быть сгруппированы в структуры / классы? Или, возможно, это просто излишне сложная функция монстра, которую можно разделить на несколько разных.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]