2013-04-18 45 views
5

Sto provando a compilare un programma fortran che utilizza un gruppo di moduli. Ottengo un errore quando lo compilo, e mi sta facendo impazzire. L'errore è nato con l'aggiunta di una subroutine ed avviene quando si tenta di ricompilare il programma:Errore di compilazione Fortran - riferimento non definito

programma principale contiene queste due righe:

-

call read_step(nStepOne,molOne) 
call read_step(nStep,mol) 

-

Si tratta di una delle subroutine in un file "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 

-

Quando provo a compilarlo, il seguente errore si pone:

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 

Altre chiamate a subroutine nello stesso modulo non ha dato alcun errore, e io non fare vedere qualsiasi differenza tra le chiamate alle "vecchie subroutine" e quella che ho appena creato.

Un esempio di uno di questi "vecchi subroutine", che non dà alcuna lamentela, è:

nel programma principale:

call get_dim(n_atom,nSnap,mol) 

Nella 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 

Non ho assolutamente idea del perché questo comportamento. Sarei grato se qualcuno potesse aiutarmi a risolvere questo incubo. Grazie!

+2

Avete eseguito 'make clean' e poi avete provato' make' di nuovo? –

+0

Sì, ma non risolve nulla. Mi sono assicurato che il fileio.o (contenente il modulo) sia aggiornato. – user2296052

risposta

7

Se la definizione di subroutine read_step si trova in un modulo, allora si è dimenticato di aggiungere l'istruzione USE per quel modulo all'inizio del programma principale, oppure le procedure pertinenti nel modulo non sono PUBBLICHE.

Con questo compilatore (e alcuni altri) nomi linker per procedure di moduli consistono generalmente nel nome del modulo seguito da 'mp' (caso può variare) seguita dal nome procedura, con varie quantità di iniziali e finali sottolineatura salate assaggiare. L'errore del linker non ha nessuno di quei "mangling", che indica che quando si compila l'ambito con il riferimento alla procedura, il compilatore non pensa che la procedura sia una procedura del modulo.

+0

Grazie mille IanH! Hai risolto il mio problema. Grazie al tuo commento realizzato che non aveva aggiunto il nome della subroutine rilevante al tag "pubblico" nella parte superiore del modulo. – user2296052

0

Per essere più concreti, mostrerò come utilizzare le istruzioni USE e PUBLIC menzionate nell'altra risposta.

ho avvolto la mia funzione F77 in questo modo:

module mod 
    contains 
    FUNCTION FUNC(PARAM) 
    ... 
    END 
    end module mod 

Mentre il vecchio codice (1986) è maiuscolo e il mio codice è caso inferiore. Questo compila bene. È possibile aggiungere public func tra module e contains. Ma questo sembra essere di default quindi non ne hai bisogno.

Durante il collegamento è necessario passare il programma e la libreria in questo modo: gfortran -o prog prog.for mod.for (o .o se compilato prima).

+0

Questa dovrebbe probabilmente essere una domanda, non una risposta. Quando si compila il sorgente con il modulo, viene generato un file oggetto (.o). Stai fornendo questo file oggetto alla successiva fase di collegamento? – IanH

+0

Lo so, ho postato una domanda: http://stackoverflow.com/questions/32278178/how-to-call-a-function-in-fortran-that-is-defined-in-a-separate-file/32278579 # 32278579 rimuoverà questo o lo aggiornerà per essere una risposta reale. ;) – JPT

Problemi correlati