I have an application that is written in C. I would like to use the LAPACK library to do some linear algebra calculations. I am using LAPACKE, which is the C interface to LAPACK. The C code compiled fine with GCC, but I am having trouble linking the libraries with GCC. It only works with GFORTRAN. I downloaded the lapack-3.11.0.tar.gz
file from the LAPACK website. I unpacked the file then I built it. I did not make any changes to the make.inc.example
file, which was already configured for a linux machine running GNU compilers. Here is how I built it once in the ~/lapack-3.11.0
directory:
cp make.inc.example make.incmake
LAPACK built successfully and all of the tests passed. Then, I built LAPACKE. To do this, I simply ran make
in the ~/lapack-3.11.0/LAPACKE
directory. Similarly, it built successfully and all of the tests passed. Notice that in my case, LAPACK is installed in my home directory and not in a system directory.
To test that I could actually use LAPACKE, I wrote a sample C program that solves a system of equations using LAPACKE_dgesv()
.
lapack_test.c:
#include <stdio.h>#include <lapacke.h>int main(){ int n = 3; int nrhs = 1; int lda = n; int ipiv[n]; double a[9] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0}; double b[3] = {3.0, 3.0, 4.0}; int info; info = LAPACKE_dgesv(LAPACK_ROW_MAJOR, n, nrhs, a, lda, ipiv, b, nrhs); if (info == 0) { printf("Solution: %f %f %f\n", b[0], b[1], b[2]); } else { printf("dgsev failed with error code %d\n", info); } return 0;}
Assuming that lapack_test.c
is in my home directory, here is how I compiled it and linked the libraries:
gcc -I./lapack-3.11.0/LAPACKE/include -c -o lapack_test.o lapack_test.c gfortran -o lapack_test lapack_test.o ./lapack-3.11.0/liblapacke.a ./lapack-3.11.0/liblapack.a ./lapack-3.11.0/librefblas.a
This gave my no errors. However, GFORTRAN is very inconvenient for my case. In my application I have many C libraries that probably will not link using GFORTRAN. Or at least, I do not think that that they will.
If I use GCC, I get linkage errors. For example, if I simply replace GFORTRAN with GCC in the last step I get a bunch of errors:
/usr/bin/ld: ./lapack-3.11.0/liblapack.a(iparmq.o): in function `iparmq_':iparmq.f:(.text+0x25e): undefined reference to `logf'/usr/bin/ld: iparmq.f:(.text+0x26b): undefined reference to `lroundf'/usr/bin/ld: ./lapack-3.11.0/liblapack.a(xerbla.o): in function `xerbla_':xerbla.f:(.text+0x55): undefined reference to `_gfortran_st_write'/usr/bin/ld: xerbla.f:(.text+0x60): undefined reference to `_gfortran_string_len_trim'/usr/bin/ld: xerbla.f:(.text+0x77): undefined reference to `_gfortran_transfer_character_write'/usr/bin/ld: xerbla.f:(.text+0x87): undefined reference to `_gfortran_transfer_integer_write'/usr/bin/ld: xerbla.f:(.text+0x8f): undefined reference to `_gfortran_st_write_done'/usr/bin/ld: xerbla.f:(.text+0x9a): undefined reference to `_gfortran_stop_string'collect2: error: ld returned 1 exit status
Seems to be linking the static library liblapacke.a
with no errors. liblapack.a
seems to be where the errors are. It is a FORTRAN library, so it makes sense why it would not link correctly using GCC.
Is there a workaround here? Is it worth using LAPACKE? Or, should I try some other way to interface between FORTRAN and C?