我正在研究我的某个计算机课程的问题,并且在尝试完成它一段时间之后我遇到了错误。
具体来说,我正在研究这个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
答案 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)
编译您的程序,以便更轻松地找到更多错误和错误。