IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

compilation avec librairie statique


Sujet :

Fortran

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 76
    Par défaut compilation avec librairie statique
    Bonsoir,
    J'ai décidément du mal à comprendre le principe des librairies en fortran 77...

    je n'arrive pas à appeler une librairie statique lors de la compilation (toujours en gfortran) :

    je crée ma librairie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gfortran  -Wall -Wextra -c fct1.F 
    ar -rv libtest.a fct1.o
    (le fichier fct1.F comprend une SUBROUTINE de nom fct1 )

    ensuite je compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gfortran -L. -ltest  fct2.F
    là j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /tmp/cc9mUQj3.o: In function `MAIN__':
    fct2.F:(.text+0xf8): undefined reference to `fct1_'
    collect2: ld returned 1 exit status
    J'imagine par analogie avec le C que je devrais déclarer le fonctions de la librairie dans un en-tête, et inclure cet en-tête dans mon programme principal, mais comme la commande INCLUDE ne semble pas standard, ça me parait louche ...
    Je ne dois pas bien raisonner, pouvez-vous m'aider ?
    Merci !

  2. #2
    Membre expérimenté Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    Bonjour

    J'imagine par analogie avec le C que je devrais déclarer le fonctions de la librairie dans un en-tête, et inclure cet en-tête dans mon programme principal, mais comme la commande INCLUDE ne semble pas standard, ça me parait louche ...
    Je ne dois pas bien raisonner, pouvez-vous m'aider ?
    Merci !
    Il faudrait déclarer ta fonction dans le programme principal si c'était une fonction, mais comme c'est une subroutine, ce n'est pas la peine.

    Sinon, ta syntaxe est correcte. Il ya parfois des problèmes de _ quand on compile du code fortran77 avec gfortran. Tu peux essayer les options
    -ff2c et/ou -fno-underscoring

    Question : pourquoi créer une bibliothèque (library == bibliothèque) avec une seule subroutine ? Tu peux simplement faire une compliation séparée.

  3. #3
    Membre expérimenté Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    J'ai fait une petit test rapide.

    J'ai effectivement le même message d'erreur en entrant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gfortran -L. -ltest p.F
    mais par contre ça fonctionne en modifiant l'ordre, i.e

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gfortran p.F -L. -ltest
    Si quelqu'un a une explication . . . je suis preneur !

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 76
    Par défaut
    Bonjour,
    et merci pour ton retour.
    ça marche effectivement pour moi aussi en changeant l'ordre des paramètres... (reste plus en effet qu'à comprendre pourquoi !)

    j'ai du coup un problème annexe (je ne maîtrise pas bien les makefile non plus...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FC=gfortran
    LDDFLAGS= -L. -ltest
    FFLAGS= -g -Wall
    DEP=p
     
    all:  $(DEP)
    	$(FC) $(FFLAGS) $(DEP).F -o $< $(LDDFLAGS)
    normalement devrait e donner l'ordre que je souhaite ; mais make s'obstine à me faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gfortran -g -Wall  -L.-ltest p.F   -o p
    Comprenez-vous pourquoi ?
    Merci

    ps : tu me demandes aussi pourquoi je crée une bibliothèque alors que je n'ai qu'une seule sous-routine : en fait j'ai simplifié au maximum mon problème pour essayer de comprendre d'où vient mon erreur et l'exposer sur ce forum.

  5. #5
    Membre expérimenté Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FC=gfortran
    LDDFLAGS= -L. -ltest
    FFLAGS= -g -Wall
    DEP=p
     
    all:  $(DEP)
    	$(FC) $(FFLAGS) $(DEP).F -o $< $(LDDFLAGS)

    Ce makefile me parait curieux. La variable $< donne la première dépendance
    (là il n'y en qu'une). La cible, c'est $@

    J'utiliserai plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    FC = gfortran
    FFLAGS = -g -Wall
    LDDFLAGS = -L. -ltest
    EXEC = p
    # Plusieurs objets en général
    OBJS = p.o 
     
    .SUFFIXES:.f90
    .f90.o:
      $(FC) $(FFLAGS) -c $<
     
    all : $(EXEC)
     
    $(EXEC) : $(OBJS)
      $(FC) $(OBJS) -o $@ $(LDDFLAGS)      
     
    clean :
      @rm -f $(OBJS) *.mod
     
    cleanall :
      @rm -f $(EXEC) $(OBJS) *.mod
    qui fait ce que tu souhaites :
    make

    gfortran -g -Wall -c -o p.o p.F
    gfortran p.o -o p -L. -ltest
    Tu as un bon tuto sur les makefile ici
    http://gl.developpez.com/tutoriel/outil/makefile/

Discussions similaires

  1. [Makefile] Compilation avec librairie Mysql
    Par lexase dans le forum Systèmes de compilation
    Réponses: 8
    Dernier message: 09/02/2007, 19h42
  2. [Makefile] Compilation avec librairie ncurses
    Par Kerod dans le forum Autres éditeurs
    Réponses: 8
    Dernier message: 13/01/2007, 02h52
  3. Compilation avec librairie externe
    Par sniper91 dans le forum NetBeans
    Réponses: 5
    Dernier message: 02/08/2006, 12h24
  4. Problème de compilation avec librairie
    Par mrttlemonde dans le forum Linux
    Réponses: 11
    Dernier message: 05/05/2006, 20h57
  5. Réponses: 2
    Dernier message: 19/08/2005, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo