Problème de dépendances dans une subroutine dans un module
Bonjour à tous,
je débute en fortran et je dois reprendre des programmes existants pour les modifier.
J'ai un programme principal en .f90 et plein de modules en .f90 aussi.
Sous Visual Compaq Fortran, j'avais des erreur de LINK quand je compilais le projet, alors que chaque module se compile séparément.
Je suis passée sous Linux sous gfortran car je ne comprenais rien aux erreurs de cet IDE.
Puis j'ai testé avec seulement 2 modules et un programme test :
J'ai un fichier "test.f90" qui utilise les modules kinds et sparsem, respectivement dans "module_kinds.f90" et "module_sparsem.f90".
Mais le module sparsem utilise le module kinds donc j'ai d'abord compilé kinds :
Code:
gfortran -c module_kinds.f90
Ce qui a marché et a crée le "kinds.mod"et "module_kinds.o", puis j'ai compilé sparsem :
Code:
gfortran -c module_sparsem.f90
Ce qui a marché et a crée le "sparsem.mod" et "module_sparsem.o", cependant quand je veux créer l'executable test :
Code:
gfortran test.f90 module_kinds.o module_sparsem.o -o test
J'ai plein d'erreurs du genre :
Code:
1 2 3
| module_sparsem.o: In function `__sparsem_MOD_get_sparse_hashm':
module_sparsem.f90:(.text+0x8046): undefined reference to `hashvr_'
collect2: ld returned 1 exit status |
Or je me suis rendue compte que les subroutines ou interfaces des fonctions qui sont indéfinies font appel au module kinds, mais je ne sais pas comment régler ce problème.
J'ai compris d'où venait le problème je pense :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| module sparsem
use kinds
implicit none
interface !external function
function hashvr(dat,r,ind,m,n,mode,nr) <== cette fonction n'est pas définie
use kinds <== pas pris en compte mais pourquoi?
integer ::hashvr,r,mode,nr,m,n
real (rh)::ind(:,:),dat(r)
end function
end interface
endmodule |
J'ai donc passé la journée à faire des Makefile (j'en avait jamais fait) pour essayer de régler les problèmes de dépendances, mais je dois mal m'y prendre car j'ai toujours les mêmes erreurs.
Je vous post un de mes Makefile :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| FC = gfortran
FFLAGS =
LDFLAGS =
prog :module_kinds.o module_sparsem.o test_sparsem.o
gfortran -o prog module_kinds.o module_sparsem.o test_sparsem.o
module_kinds.o :
gfortran -c module_kinds.f90
module_sparsem.o : module_kinds.o
gfortran -c module_sparsem.f90
test_sparsem.o : module_kinds.o module_sparsem.o
gfortran -c test_sparsem.f90
clean :
rm -f *.o *.mod prog |
Voilà, ça fait 2 jours que je coince là-dessus alors si vous avez ne serait-ce qu'une petite idée, n'hésitez pas.
Merci d'avance