0

我希望使用 LAPACKE 库对 LAPACK 库进行 C/C++ 调用。在多个设备上,我尝试编译一个简单的程序,但 LAPACKE 似乎没有正确链接。

这是我的代码,对此示例稍作修改:

#include <cstdio>

extern "C"
{
#include "lapacke.h"
}
// extern "C" {
//     // LU decomoposition of a general matrix
//     void LAPACK_dgetrf(int* M, int *N, double* A, int* lda, int* IPIV, int* INFO);

//     // generate inverse of a matrix given its LU decomposition
//     void LAPACK_dgetri(int* N, double* A, int* lda, int* IPIV, double* WORK, int* lwork, int* INFO);
// }

extern "C"
{
    #include <lapacke.h>
}

void inverse(double* A, int N)
{
    int *IPIV = new int[N];
    int LWORK = N*N;
    double *WORK = new double[LWORK];
    int INFO;

    dgetrf_(&N,&N,A,&N,IPIV,&INFO);
    dgetri_(&N,A,&N,IPIV,WORK,&LWORK,&INFO);

    delete[] IPIV;
    delete[] WORK;
}

int main(){

    double A [2*2] = {
        1,2,
        3,4
    };

    inverse(A, 2);

    printf("%f %f\n", A[0], A[1]);
    printf("%f %f\n", A[2], A[3]);

    return 0;
}

我已经使用 apt 包管理器安装了 blas、lapack 和 lapacke:

sudo apt-get install libblas-dev liblapack-dev liblapacke-dev

我正在编译:

g++ -lblas -llapack -llapacke -I /usr/include main.cpp

-据我所知,我不应该是必需的,但无论如何我都会把它放进去。我收到以下错误:

'/usr/bin/ld: /tmp/ccJSTpTf.o: in function `inverse(double*, int)':
main.cpp:(.text+0x9f): undefined reference to `dgetrf_'
/usr/bin/ld: main.cpp:(.text+0xc8): undefined reference to `dgetri_'
collect2: error: ld returned 1 exit status

无论我是从源代码编译 lapacke、导入整个头文件、将函数本身声明为 extern,还是将函数的名称更改为以下任何一个,这个问题仍然存在:dgetrf()dgetrf_()LAPACK_dgetrf(),所有我见过的 LAPACK 样式调用的常用名称。

查看 Lapacke 标头,看起来 LAPACK_dgetrf() 转换为 lapack 函数调用 dgetrf_()。打开静态压缩包查找 dgetrf,我可以发现 liblapack.a 有一个函数对象 dgetrf.o,而 liblapacke.a 有一个函数 lapack_dgetrf.o。我在想问题的根源是LAPACK_dgetrf()基本上是dgetrf_(),而链接器找不到dgetrf_(),因为LAPACK有一个叫做dgetrf()的函数,而不是dgetrf_()。不过我很困惑,因为编译器没有抱怨任何链接库不存在,而且似乎没有其他人在他们的设备上遇到这个问题,而我现在已经在 3 个单独的设备上遇到了这个问题(所有 ubuntu基于)。

我需要做什么才能让 LAPACKE 编译,不仅仅是 C,而是 C++?

4

1 回答 1

1

我正在编译:g++ -lblas -llapack -llapacke -I /usr/include main.cpp

那个命令行是错误的。改为这样做:

g++ main.cpp -llapacke -llapack -lblas

要了解源和库的顺序为何如此重要,请阅读内容。

于 2021-06-12T23:53:34.183 回答