2017-12-09 2 views
0

Ich arbeite an einem Problem für einen meiner Computerkurse und ich war in einem Fehler stecken geblieben, nachdem ich versucht habe, es für einige Zeit durchzuarbeiten.`undefinierter Verweis auf` sgtsv_'` beim Kompilieren eines Tridiagonallösers

Insbesondere arbeite ich an dieser Fortran-Routine:

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 

Diese Routine löst lineare Systeme Gaußsche Eliminations zu verwenden, wenn die Matrizen tridiagonal sind.

Allerdings, wenn ich versuche, eine Make-Datei erstellen mit:

gfortran linsolve_sgtsv.f90 -o linsolve.f90 

ich folgende Fehlermeldungen erhalten:

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

Ich glaube nicht, dass es das Problem ist, obwohl die Benennung der Ausgabedatei '.f90' sicherlich eine schlechte Idee ist. Ich denke, Vishnu verlinkt einfach nicht in LAPACK. Zumindest, um die Dateinamen zu sehen. Verwenden Sie einfach "-llapack" und vergewissern Sie sich, dass LAPACK installiert ist. –

Antwort

1

ich keine direkte Kopie nicht finden kann. Viele Menschen haben ähnliche Probleme, aber sie wissen normalerweise ein bisschen mehr und Ihre Frage ist einfacher.

Der Tridiagonallöser sgtsv() ist kein Fortran-Unterprogramm. Es wird in einer Bibliothek bereitgestellt, die LAPACK und viele andere Implementierungen (z. B. MKL) genannt wird. Das bedeutet, dass Sie dem Compiler mitteilen müssen, dass diese Bibliothek (Link) enthalten sein soll.

, die durch Zugabe von -llapack getan wird (-l bedeutet „link“ und lapack ist der Name der Bibliothek, die in einer Datei liblapack.so oder liblapack.a genannt gespeichert ist) am Ende des Kompilierungsbefehl.

Sie müssen seine Bibliothek in Ihrem Computer installiert haben, damit das Link-Flag funktioniert. In vielen Linux-Distributionen ist es in den Repositories enthalten.

Die richtige Linie

gfortran linsolve_sgtsv.f90 -o linsolve -llapack 

Wenn die Bibliothek (liblapack.a oder liblapack.so) in einem Verzeichnis installiert ist, der Compiler kann nicht sehen, müssen Sie

gfortran linsolve_sgtsv.f90 -o linsolve -L/path/to/liblapack -llapack 

See gfortran LAPACK "undefined reference" error auch nutzen würde und das Handbuch Ihres Compilers für mehr.


Hinweis habe ich -o linsolve statt -o linsolve.f90. Es ist eine sehr schlechte Idee, Ihre ausführbare Datei mit einer .f90 Erweiterung zu benennen. Nur Fortran-Quelldateien sollten den Namen .f90 haben.


Es wird mehr Probleme in Ihrem Code. Sie werden angezeigt, wenn Sie mit dem Testen beginnen. Zum Beispiel yoy tun

(1/11) 

Dies wird das mathematische Ergebnis von 1,0/11,0 nicht zurück, wird er zurückkehren 0 über Integer-Division in Fortran Lernen. Siehe Why are the elements of an array formatted as zeros when they are multiplied by 1/2 or 1/3? und Simple program, that only produce zeros, bug?

Wenn Sie weitere Probleme finden, nachdem Sie Ihren Code ausführen können, können Sie eine neue Frage stellen.

Ich empfehle, Ihre Programme mit -g -fcheck=all -Wall zu kompilieren, um mehr Bugs und Fehler einfacher zu finden.