2

I have a problem with lapack on my new ubuntu machine (edit: Ubuntu 20.04.5 LTS). I installed liblapack-dev and libblas-dev using apt-get. I used a following code which works normally on different machine.

#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[LDAN] = { 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 AX = 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" ); }

but compiling with the following command:

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

leads to the following problem:

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

I have exactly the same problem with other, more complex code which uses different lapack routines.

Any idea what may cause the problem? I also tried to add -L flag with the directory containing lapack files after -llapack but it did not help.

1 Answers1

1

The issue seems to be that, although dgesv is the name of the Fortran function, it is exposed in the C/C++ API as dgesv_. So whereas

$ 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

fails;

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

succeeds, and the resulting executable runs successfully:

$ ./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

Alternatively, you might consider installing the lapacke-dev package and using LAPACKE_dgesv instead.

For further reading see Using BLAS and LAPACK from C/C++ .

steeldriver
  • 142,475