编译三角形求解器时{`未定义对`sgtsv_'`的引用

时间:2017-12-09 10:26:18

标签: fortran

我正在研究我的某个计算机课程的问题,并且在尝试完成它一段时间之后我遇到了错误。

具体来说,我正在研究这个Fortran例程:

program linsolve_sgtsv
implicit none
integer, parameter :: lda=10,ldb=lda,nrhs=1
real :: dl(lda-1),d(lda),du(lda-1),b(ldb,nrhs)
integer :: n,info

n = 10
dl(1:n-1) = 1+(1/11); d(1:n) = 2; du(1:n-1) = 1-(1/11)
b(1:n,1) = (/1,1,1,1,1,1,1,1,1,1/)
call sgtsv(n,nrhs,dl,d,du,b,ldb,info)
if (info==0) then
    print *, '--- x is ----------------'
    print '(g22.16)', b(1:n,1)
else
    print *, 'info = ',info
end if

end program linsolve_sgtsv

当矩阵是三对角时,该例程使用高斯消元法求解线性系统。

但是,当我尝试使用:

创建一个makefile时
gfortran linsolve_sgtsv.f90 -o linsolve.f90

我收到以下错误:

tmp/ccCiRHve.o: In function `MAIN__':
linsolve_sgtsv.f90:(.text+0x100): undefined reference to `sgtsv_'
collect2: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分:2)

我找不到任何直接复制品。很多人都有类似的问题,但他们通常知道的更多,你的问题更基本。

三角形求解器sgtsv()不是Fortran内置子程序。它在名为LAPACK的库和许多其他实现(例如,MKL)中提供。这意味着您必须告诉编译器它应该包含(链接)该库。

通过添加-llapack-l表示“链接”来完成,lapack是存储在名为liblapack.so或{{的文件中的库的名称1}})在编译命令的末尾。

您必须在计算机中安装其库才能使链接标志生效。在许多Linux发行版中,它都包含在存储库中。

正确的行是

liblapack.a

如果库(gfortran linsolve_sgtsv.f90 -o linsolve -llapack liblapack.a)安装在编译器看不到的某个目录中,则必须使用

liblapack.so

另请参阅gfortran LAPACK "undefined reference" error和编译器手册了解更多信息。

注意我做了gfortran linsolve_sgtsv.f90 -o linsolve -L/path/to/liblapack -llapack 而不是-o linsolve。使用-o linsolve.f90扩展名命名可执行文件是一个非常糟糕的主意。只有Fortran源文件应命名为.f90

您的代码中会出现更多问题。它们会在您开始测试时出现。例如,yoy do

.f90

这将不会返回1.0 / 11.0的数学结果,它将返回0.了解Fortran中的整数除法。请参阅Why are the elements of an array formatted as zeros when they are multiplied by 1/2 or 1/3?Simple program, that only produce zeros, bug?

如果您在运行代码后发现更多问题,可以提出新问题。

我建议使用 (1/11) 编译您的程序,以便更轻松地找到更多错误和错误。