LAPACKE C++链接错误.找不到函数



我希望使用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 %fn", A[0], A[1]);
printf("%f %fn", 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((edtrf(((或LAPACK_dgetr((,这些都是我在LAPACK系统调用中看到的常见名称。

仔细查看Lapacke标头,它看起来像是LAPACK_dgetrf((转换为一个调用dgetrf((的LAPACK函数。打开静态档案来查找dgetrf,我可以发现liblapack.a有一个函数对象dgetrf.o,liblapack-a有一个功能对象lapack_dgetrf.o。不过,我很困惑,因为编译器没有抱怨任何链接库不存在,而且似乎没有其他人在他们的设备上有这个问题,而我现在已经在3个独立的库上遇到了这个问题(都是基于ubuntu的(。

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

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

该命令行错误。改为:

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

要理解为什么源和库的顺序很重要,请阅读本文。

相关内容

  • 没有找到相关文章

最新更新