与 lapack 链接的问题

与 lapack 链接的问题

我在新的 ubuntu 机器上使用 lapack 时遇到问题(编辑:Ubuntu 20.04.5 LTS)。我安装liblapack-devlibblas-dev使用了apt-get。我使用了以下代码,该代码在不同的机器上正常运行。

#include <stdlib.h>
#include <stdio.h>

/* DGESV prototype */
extern void dgesv( int* n, int* nrhs, double* a, int* lda, int* ipiv,
                double* b, int* ldb, int* info );
/* Auxiliary routines prototypes */
extern void print_matrix( char* desc, int m, int n, double* a, int lda );
extern void print_int_vector( char* desc, int n, int* a );

/* Parameters */
#define N 5
#define NRHS 3
#define LDA N
#define LDB N

/* Main program */
int main() {
        /* Locals */
        int n = N, nrhs = NRHS, lda = LDA, ldb = LDB, info;
        /* Local arrays */
        int ipiv[N];
        double a[LDA*N] = {
            6.80, -2.11,  5.66,  5.97,  8.23,
           -6.05, -3.30,  5.36, -4.44,  1.08,
           -0.45,  2.58, -2.70,  0.27,  9.04,
            8.32,  2.71,  4.35, -7.17,  2.14,
           -9.67, -5.14, -7.26,  6.08, -6.87
        };
        double b[LDB*NRHS] = {
            4.02,  6.19, -8.22, -7.57, -3.03,
           -1.56,  4.00, -8.67,  1.75,  2.86,
            9.81, -4.09, -4.57, -8.61,  8.99
        };
        /* Executable statements */
        printf( " DGESV Example Program Results\n" );
        /* Solve the equations A*X = B */
        dgesv( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info );
        /* Check for the exact singularity */
        if( info > 0 ) {
                printf( "The diagonal element of the triangular factor of A,\n" );
                printf( "U(%i,%i) is zero, so that A is singular;\n", info, info );
                printf( "the solution could not be computed.\n" );
                exit( 1 );
        }
        /* Print solution */
        print_matrix( "Solution", n, nrhs, b, ldb );
        /* Print details of LU factorization */
        print_matrix( "Details of LU factorization", n, n, a, lda );
        /* Print pivot indices */
        print_int_vector( "Pivot indices", n, ipiv );
        exit( 0 );
} /* End of DGESV Example */

/* Auxiliary routine: printing a matrix */
void print_matrix( char* desc, int m, int n, double* a, int lda ) {
        int i, j;
        printf( "\n %s\n", desc );
        for( i = 0; i < m; i++ ) {
                for( j = 0; j < n; j++ ) printf( " %6.2f", a[i+j*lda] );
                printf( "\n" );
        }
}

/* Auxiliary routine: printing a vector of integers */
void print_int_vector( char* desc, int n, int* a ) {
        int j;
        printf( "\n %s\n", desc );
        for( j = 0; j < n; j++ ) printf( " %6i", a[j] );
        printf( "\n" );
}

但使用以下命令进行编译:

gcc -Wall test.c -lm -lblas -llapack

导致以下问题:

/usr/bin/ld: /tmp/ccTfUyXO.o: in function `main':
test.c:(.text+0x2e3): undefined reference to `dgesv'
collect2: error: ld returned 1 exit status

我在使用不同 lapack 例程的其他更复杂的代码中遇到了完全相同的问题。

知道什么可能导致问题吗?我还尝试在 -llapack 之后添加包含 lapack 文件的目录的 -L 标志,但没有帮助。

答案1

问题似乎是,dgesv尽管Fortran函数,它在 C/C++ API 中暴露为dgesv_。因此

$ gcc -Wall test.c -lm -lblas -llapack
/usr/bin/ld: /tmp/ccp4Lcye.o: in function `main':
test.c:(.text+0x2e3): undefined reference to `dgesv'
collect2: error: ld returned 1 exit status

失败;

$ sed -i 's/dgesv/&_/' test.c
$ 
$ gcc -Wall test.c -lm -lblas -llapack; echo $?
0

成功,并且生成的可执行文件成功运行:

$ ./a.out
 DGESV Example Program Results

 Solution
  -0.80  -0.39   0.96
  -0.70  -0.55   0.22
   0.59   0.84   1.90
   1.32  -0.10   5.36
   0.57   0.11   4.04

 Details of LU factorization
   8.23   1.08   9.04   2.14  -6.87
   0.83  -6.94  -7.92   6.55  -3.99
   0.69  -0.67 -14.18   7.24  -5.19
   0.73   0.75   0.02 -13.82  14.19
  -0.26   0.44  -0.59  -0.34  -3.43

 Pivot indices
      5      5      3      4      5

或者,您可以考虑安装该lapacke-dev包并使用LAPACKE_dgesv

如需进一步阅读,请参阅在 C/C++ 中使用 BLAS 和 LAPACK

相关内容