2016-10-19 27 views
0

编译需要它们的C代码时,我遇到了LAPACK/BLAS库的问题。未定义引用`zgesvd_' - C汇编中的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

问题解决了!万岁!我只是手舞足蹈我的办公室......

对于那些谁有同样的问题,这里是我做过什么:

1)按照给定的here使LAPACK和BLAS库的说明。套用,为科学版Linux 6的机器,它们分别是:

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)则(重要的一点,也建议here):

编辑make.inc并添加-m64 -fPIC标志Fortran编译器选项:FORTRAN,OPTS,noopt中,装载机

然后

make blaslib 
make 

现在,你有什么,在/lapack-3.6.1(或任何你的目录这个过程称为后)两个文件:

librefblas.a和liblapack.a。

3)我做的下一件事就是librefblas.a和liblapack.a复制到一些子目录 - 即/ lib中liblapack.a和/ lib目录/ libblas为librefblas.a

4/liblapack)然后,把这些目录在你的makefile,就像这样:

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) 

我还添加/路径/ lib目录/ LAPACK和/路径/ lib目录/ BLAS到我的LD_LIBRARY_PATH(和路径,刚刚在的情况下...)

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

然后,转到任何你Makefile所在的地方,然后输入

make 

Yay yay yay!

顺便说一下,在步骤1)中获得的最新版本的lapack和blas中,我使用gcc version 5.1.0和相应的mpicc(openmpi 1.10。2)。

希望这可以帮助别人,并分享绝对的喜悦。