未定义的对“zgesvd_”的引用--C编译中的BLAS问题

时间:2016-10-19 13:17:05

标签: blas

编译需要它们的C代码时,我遇到了LAPACK / BLAS库的问题。

问题是,当我运行“make”时,我得到:

file.c:(.text+0x1c41): undefined reference to `zgesvd_'
file.c:(.text+0x1c9c): undefined reference to `zgetrf_'
../file.a(SpatialOrientation.o): In function `myfunction.c':myfunction.c:(.text+0x7be): undefined reference to `dsyev_'

以及其他几个这样的行,都指的是类似的缺失引用。

我已将此错误归咎于与BLAS有关。我按照this excellent link给出的指示安装BLAS并将相关目录放在路径上。我还相应地更改了我的Makefile以找到这些库。

对此问题的任何帮助都将非常感谢!

为了更新,我最近也安装了itpp,也遵循了教学here,因为看起来我的遗失引用与之相关。到目前为止没有变化......

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

The problem is solved! Hooray! I just danced around my office...

For those who have the same problem, here is what I did:

1) Follow the instructions given here to make the lapack and blas libraries. To paraphrase, for a scientific Linux 6 machine, they are:

wget http://www.netlib.org/lapack/lapack.tgz
tar xvzf lapack.tgz
cd lapack-3.3.0  //if version number changes, change here to the right directory
mv make.inc.example make.inc

2) Then (important bit, also recommended here):

edit make.inc and add -m64 -fPIC flag to fortran compiler options: FORTRAN, OPTS, NOOPT, LOADER

Then

make blaslib
make

Now, what you have is, in /lapack-3.6.1 (or whatever your directory is called after this process), two files:

librefblas.a , and liblapack.a.

3) The next thing I did was to copy librefblas.a and liblapack.a into some subdirectories - i.e. /lib/liblapack for liblapack.a and /lib/libblas for librefblas.a

4) Then, put those directories in your makefile, like this:

LIBDIR1 = /path/lib/lapack
LIBDIR2 = /path/lib/blas

LIBS =   -L$(LIBDIR1) -llapack  -L$(LIBDIR2) -lblas $(SYSLIBS)
LIBSMPI = -L$(LIBDIR1) -llapack -L$(LIBDIR2) -lblas  $(MPILIBS) $(SYSLIBS)

I also added /path/lib/lapack and /path/lib/blas onto my LD_LIBRARY_PATH (and PATH, just-in-case...)

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/lib/lapack:/path/lib/blas
export PATH=$PATH:/path/lib/lapack:/path/lib/blas

Then, go to wherever you Makefile is, and type

make

Yay yay yay!

By the way, with the latest version of lapack and blas, obtained in step 1), I compiled with gcc version 5.1.0 and the corresponding mpicc (openmpi 1.10.2).

Hope this helps someone else and shares the absolute delight.