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_() であり、LAPACK には dgetrf_() ではなく dgetrf() という関数があるため、リンカが dgetrf_() を見つけられないことが問題の根本にあると考えています。ただし、コンパイラはリンクされたライブラリが存在しないことを訴えなかったので、私は非常に混乱しています.ベース)。

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 に答える