LAPACKE C++ 链接错误。找不到函数
LAPACKE C++ linking error. Unable to find function
我希望使用 LAPACKE 库对 LAPACK 库进行 C/C++ 调用。在多个设备上,我试图编译一个简单的程序,但 LAPACKE 似乎没有正确链接。
这是我的代码,稍微修改自 this example:
#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
据我所知,-I 不应该是必要的,但我无论如何还是把它放在里面以确保。我收到以下错误:
'/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、导入整个 header、将函数本身声明为 extern,还是将函数名称更改为以下任何名称,此问题仍然存在: dgetrf()、dgetrf_() 或 LAPACK_dgetrf(),我见过的所有常用名称 LAPACK-sytle 来电。
查看 Lapacke header,看起来 LAPACK_dgetrf() 转换为 lapack 函数调用 dgetrf_()。解开静态存档查找 dgetrf,我可以发现 liblapack.a 有一个函数 object dgetrf.o,而 liblapacke.a 有一个函数 lapack_dgetrf.o。我认为问题的根源在于 LAPACK_dgetrf() 基本上是 dgetrf_(),而链接器找不到 dgetrf_(),因为 LAPACK 具有称为 dgetrf() 的函数,而不是 dgetrf_()。不过我很困惑,因为编译器没有抱怨任何链接库不存在,而且似乎没有其他人在他们的设备上遇到过这个问题,而我现在已经在 3 个单独的设备上遇到过(所有 ubuntu基于)。
我需要做什么才能让 LAPACKE 不仅针对 C,而且针对 C++ 进行编译?
I am compiling with: g++ -lblas -llapack -llapacke -I /usr/include main.cpp
那个命令行是错误的。改为这样做:
g++ main.cpp -llapacke -llapack -lblas
要了解源和库的顺序为何重要,请阅读 this。
我希望使用 LAPACKE 库对 LAPACK 库进行 C/C++ 调用。在多个设备上,我试图编译一个简单的程序,但 LAPACKE 似乎没有正确链接。
这是我的代码,稍微修改自 this example:
#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
据我所知,-I 不应该是必要的,但我无论如何还是把它放在里面以确保。我收到以下错误:
'/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、导入整个 header、将函数本身声明为 extern,还是将函数名称更改为以下任何名称,此问题仍然存在: dgetrf()、dgetrf_() 或 LAPACK_dgetrf(),我见过的所有常用名称 LAPACK-sytle 来电。
查看 Lapacke header,看起来 LAPACK_dgetrf() 转换为 lapack 函数调用 dgetrf_()。解开静态存档查找 dgetrf,我可以发现 liblapack.a 有一个函数 object dgetrf.o,而 liblapacke.a 有一个函数 lapack_dgetrf.o。我认为问题的根源在于 LAPACK_dgetrf() 基本上是 dgetrf_(),而链接器找不到 dgetrf_(),因为 LAPACK 具有称为 dgetrf() 的函数,而不是 dgetrf_()。不过我很困惑,因为编译器没有抱怨任何链接库不存在,而且似乎没有其他人在他们的设备上遇到过这个问题,而我现在已经在 3 个单独的设备上遇到过(所有 ubuntu基于)。
我需要做什么才能让 LAPACKE 不仅针对 C,而且针对 C++ 进行编译?
I am compiling with:
g++ -lblas -llapack -llapacke -I /usr/include main.cpp
那个命令行是错误的。改为这样做:
g++ main.cpp -llapacke -llapack -lblas
要了解源和库的顺序为何重要,请阅读 this。