Fortran compilation error - undefined reference
Ich versuche zu kompilieren fortran-Programm, das verwendet eine Reihe von Modulen. Ich erhalten eine Fehlermeldung wenn ich es kompilieren, und es macht mich verrückt. Der Fehler ist entstanden durch den Zusatz von einem Unterprogramm erfolgt, wenn ich versuche zu kompilieren Sie das Programm:
Hauptprogramm enthält diese beiden Zeilen:
--
call read_step(nStepOne,molOne)
call read_step(nStep,mol)
--
Dieser ruft eine der Subroutinen in einer Datei "fileio.f90":
--
subroutine read_step(n,tape)
implicit none
integer, intent(in) :: tape
integer, intent(out) :: n
character(len=6) :: dum
rewind(tape)
read (tape,*)
read (tape,*) dum, n
rewind(tape)
return
!
end subroutine read_step
--
Wenn ich versuche zu kompilieren, wird die folgende Fehlermeldung auftaucht:
ifort -o SpIdMD.x *.o -static-intel -openmp
SpIdMD.o: In function `MAIN__':
SpIdMD.f90:(.text+0x3b2): undefined reference to `read_step_'
SpIdMD.f90:(.text+0x3c5): undefined reference to `read_step_'
make: *** [SpIdMD.x] Error 1
Andere Aufrufe von Unterprogrammen, die in das gleiche Modul hat keine Fehler, und ich sehe keinen Unterschied zwischen den aufrufen der "alten Subroutinen" und die, die ich gerade erstellt.
Ein Beispiel für eine dieser "alten Subroutinen", die keine Beschwerde, ist:
Im Hauptprogramm:
call get_dim(n_atom,nSnap,mol)
In der fileio.f90:
subroutine get_dim(n,n_snap,tape)
implicit none
integer,intent(in) :: tape
integer,intent(out) :: n, n_snap
integer :: m
rewind(tape)
read (tape,*,err=1,end=2) n
rewind(tape)
m = 0
do while (.true.)
read (tape,*,err=1,end=3)
m = m +1
end do
3 n_snap = m/(n + 2)
if (m.ne.(n_snap*(n + 2))) stop 'unexpected end of input file'
rewind(tape)
return
!
1 stop 'error in input file'
2 stop 'unexpected end of input file'
end subroutine get_dim
Ich habe absolut keine Ahnung, warum dieses Verhalten. Ich wäre dankbar, wenn jemand mir helfen könnte dieses Problem lösen Alptraum. Danke!
- Haben Sie
make clean
und dann versuchtmake
wieder ? - Yep, aber ist für nichts eine Lösung. Ich sorgte dafür, dass die fileio.o (mit dem Modul) aktualisiert wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die definition der subroutine read_step ist in ein Modul, dann hast du entweder vergessen, fügen Sie die USE-Anweisung für das Modul auf der Oberseite des Haupt-Programm oder die relevanten Prozeduren in das Modul sind nicht ÖFFENTLICH.
Mit diesem compiler (und einige andere) linker Namen für das Modul Verfahren bestehen in der Regel aus den Namen des Moduls, gefolgt von 'mp' (Etui kann variieren), gefolgt von den Namen der Prozedur, mit verschiedenen Mengen von führenden und nachgestellten unterstreicht gesalzen, um zu schmecken. Ihr linker Fehler nicht, dass "mangeln", was bedeutet, dass beim kompilieren des Bereichs mit der Prozedur-Referenz, die der compiler nicht glaube, das Verfahren ist eine Modul-Prozedur.
Mehr Beton, werde ich Ihnen zeigen, wie die Nutzung und ÖFFENTLICHEN Aussagen in die andere Antwort.
Wickelte ich meine F77-Funktion wie diese:
Beim alten code (1986) oberen Fall und mein code ist Kleinschreibung.
Dies stellt in Ordnung. Sie können
public func
zwischenmodule
undcontains
. Aber das scheint Standard, so dass Sie es nicht brauchen.Wenn die Verknüpfung, die Sie übergeben müssen, Ihr Programm und die Bibliothek so:
gfortran -o prog prog.for mod.for
(oder.o
wenn kompiliert vor).