未定义的LAPACK和BLAS子例程的引用

时间:2016-10-18 17:33:23

标签: fortran lapack blas matrix-inverse

我正在尝试理解Fortran中的BLAS和LAPACK是如何工作的,所以我创建了一个生成矩阵并反转它的代码。

这是代码

SELECT

矩阵A在我正在调用的文件中,我也说矩阵的大小(M)。当我用gfortran将它们复制时,我得到了这些消息

  

/tmp/ccVkb1zY.o:在函数program test Implicit none external ZGETRF external ZGETRI integer ::M complex*16,allocatable,dimension(:,:)::A complex*16,allocatable,dimension(:)::WORK integer,allocatable,dimension(:)::IPIV integer i,j,info,error Print*, 'Enter size of the matrix' Read*, M Print*, 'Enter file of the matrix' READ(*,*), A OPEN(UNIT=10,FILE = '(/A/)' ,STATUS='OLD',ACTION='READ') allocate(A(M,M),WORK(M),IPIV(M),stat=error) if (error.ne.0)then print *,"error:not enough memory" stop end if !definition of the test matrix A do i=1,M do j=1,M if(j.eq.i)then A(i,j)=(1,0) else A(i,j)=0 end if end do end do call ZGETRF(M,M,A,M,IPIV,info) if(info .eq. 0) then write(*,*)"succeded" else write(*,*)"failed" end if call ZGETRI(M,A,M,IPIV,WORK,M,info) if(info .eq. 0) then write(*,*)"succeded" else write(*,*)"failed" end if deallocate(A,IPIV,WORK,stat=error) if (error.ne.0)then print *,"error:fail to release" stop end if close (10) end program test zgetrf_'中   test.f03 :(。text + 0x85d):对`zgetri_'的未定义引用   collect2:错误:ld返回1退出状态

我已经安装了BLAS和LAPACK,所以我不知道我是否以正确的方式调用了这个库。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

看起来您可能没有链接到库。尝试:

gfortran -o test test.f03 -llapack -lblas

这会导致链接器(将所有程序部分连接在一起的程序;在UNIX上通常称为“ld”)在程序中包含LAPACK调用的库代码(或其动态链接)。

如果上述行的结果是“找不到-llapack”或类似的,则有两个常见问题:

  1. 库可以“共享”(名称以“.so”结尾)或“静态”(名称以“.a”结尾);链接器将查找共享链接器,因此如果您只有静态链接器,则应在库链接之前添加“-static”:

    gfortran -o test test.f03 -static -llapack -lblas
    

    这也将使它寻找BLAS的静态版本;如果您需要共享版本,请在“-lblas”前添加“-shared”:

    gfortran -o test test.f03 -static -llapack -shared -lblas

    您可能会发现this page有帮助。

  2. 链接器没有查找库的正确目录。您需要找到实际的库(称为“liblapack.so”或“liblapack.a”),并确保它所在的目录包含在链接器所在的目录中,例如:让它看看“/ mylibs / maths”:

    gfortran -o test test.f03 -L/mylibs/maths -llapack -lblas