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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
gfortran test.f90 module_kinds.o module_sparsem.o -o test
J'ai plein d'erreurs du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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