c++ - 在 C++ 中绑定(bind) C 函数( undefined reference )

标签 c++ c extern

我有一个像 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/

相关文章:

C : expected ')' before '*' token 中的编译器错误

c - 外部 undefined symbol

c - 如何在文件之间共享常量字符串数组?

c++ - 运算符重载内存泄漏

C++ 全局函数

c - K&R C 处理八进制

c - 为什么 n++ 比 n=n+1 执行得更快?

c - 在 'header.h' 文件中声明了一个自引用结构并试图在 'main.c' 中定义它,这会导致错误

c++ - 通过 C++ 在 csv 中插入值

c++ - 两个无符号短裤的乘法真的会导致未定义的行为吗?