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 :

Erreur édition des liens


Sujet :

Fortran

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Erreur édition des liens
    Hello,
    j'ai un petit oprogramme fortran qui compile mais qui ne passe pas l'édition des liens... J'ai identifié le bloc qui pose problème et c'est donc uniquement ce module que je poste, lorsque je l'enlève de mon programme l'édition des liens se fait normalement:

    Module:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    MODULE dde_particle_solver
     
      USE define_DDE
      USE DDE_SOLVER_M
     
    CONTAINS
     
     
      FUNCTION DDE_SIM(CT0, CTF, CNPART, CG, CSIGMA, COMEGA)
     
          IMPLICIT NONE
     
      ! Variable declaration
     
          INTEGER :: CNPART
     
          DOUBLE PRECISION :: CT0, CTF, CG
          DOUBLE PRECISION, DIMENSION(CNPART) :: CSIGMA, COMEGA
     
          INTEGER :: I, J
          INTEGER, DIMENSION(2) :: NVAR 
          DOUBLE PRECISION, DIMENSION(1) :: DELAY
          DOUBLE PRECISION, DIMENSION(CNPART) :: HISTORY
     
          TYPE(DDE_SOL) :: DDE_SIM
          TYPE(DDE_OPTS) :: OPTS
     
          INTENT(IN)  :: CT0, CTF, CNPART, CG, CSIGMA, COMEGA
     
      ! Variable initialisation
     
          G = CG
          SIGMA = CSIGMA
          OMEGA = COMEGA
          NEQN = CNPART
     
          NVAR(1) = NEQN
          NVAR(2) = NLAGS
          DELAY(1) = 1.0D0
     
          DO I = 1,NEQN
              HISTORY(I) = 1.0D0 + 1.0D0/I
          ENDDO
     
          OPTS = DDE_SET(RE=1D-8,AE=1D-10,INTERPOLATION=.TRUE.)
     
      ! Simulation
     
          DDE_SIM = DDE_SOLVER(NVAR, DDES, DELAY, HISTORY, TSPAN=(/ 0.0D0, 200.0D0 /), OPTIONS=OPTS)
     
          RETURN
     
      END FUNCTION DDE_SIM
     
    END MODULE dde_particle_solver
    Le message obenu a l'édition des :liens:
    gfortran -c src/essai.f90 -o obj/essai.o
    gcc -L/home/vince/gsl-1.9/lib -lm -lgsl -lgslcblas obj/main.o obj/utils.o obj/dde.o obj/essai.o -o bin/dde
    obj/essai.o: In function `__dde_particle_solver__dde_sim':essai.f90.text+0x1ac): undefined reference to `_gfortran_internal_malloc'
    :essai.f90.text+0x3d7): undefined reference to `__dde_solver_m__dde_set'
    :essai.f90.text+0x5ab): undefined reference to `__dde_solver_m__dkl_4'
    :essai.f90.text+0x5b9): undefined reference to `_gfortran_internal_free'
    collect2: ld returned 1 exit status
    Si quelqu'un a une idée (je débute en fortran dc désolé si l'erreur est bidon mais je sèche..).
    Je me dit que c'est peut être parce que je fait l'édition des liens avec gcc (je dois interfacer du C et du fortran), mais comme ca marche lorsque je vire ce module...

    Voila merci d'avance

  2. #2
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Un peu plus de précisions sur mon pb.

    Voici déja mon 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #------------------------------------------------------------
    # Makefile. Auteurs: Vincent
    #------------------------------------------------------------
     
    PATH_GSL    = /home/leguilloux/gsl-1.9/
    PATH_OBJ    = obj/
    PATH_SCR    = src/
    PATH_HEADER = headers/
    PATH_BIN    = bin/
     
    PROG        = dde
    CC          = gcc
    FCC         = gfortran
     
    CFLAGS      = -Wall -Wextra -Wwrite-strings -Wstrict-prototypes -D MD_OS_LINUX -I$(PATH_GSL)include
    LFLAGS	    = -L$(PATH_GSL)lib -lm -lgsl -lgslcblas
     
    OBJ = $(PATH_OBJ)main.o $(PATH_OBJ)dde.o $(PATH_OBJ)dde_solver_m_unix.o $(PATH_OBJ)essai.o  
     
    #------------------------------------------------------------
    # REGLE GENERALE DE COMPILATION
    #------------------------------------------------------------
    $(PATH_OBJ)%.o: $(PATH_SCR)%.c $(PATH_HEADER)%.h
    	$(CC) $(CFLAGS) -c $< -o $@
     
    $(PATH_OBJ)%.o: $(PATH_SCR)%.f90
    	$(FCC) -c $< -o $@
     
    #-----------------------------------------------------------
    # REGLE POUR L'EXECUTABLE
    #-----------------------------------------------------------
    $(PATH_BIN)$(PROG): $(OBJ)
    	$(CC) $(LFLAGS) $^ -o $@
     
    #-----------------------------------------------------------
    # DEPENDANCES
    #-----------------------------------------------------------
    $(PATH_OBJ)main.o: $(PATH_HEADER)main.h $(PATH_HEADER)dde.h
    $(PATH_OBJ)dde.o: $(PATH_HEADER)dde.h
    Donc, lorsque je fais l'édition des liens avec gcc, ca marche pas, j'ai une tartine de message de même type que précédement cité... Ce genre là:
    (...)
    :dde_solver_m_unix.f90.text+0x2032e): undefined reference to `_gfortran_deallocate'
    :dde_solver_m_unix.f90.text+0x2035a): undefined reference to `_gfortran_deallocate'
    obj/dde_solver_m_unix.o:dde_solver_m_unix.f90.text+0x20386): more undefined references to `_gfortran_deallocate' follow
    obj/dde_solver_m_unix.o: In function `__dde_solver_m__dde_drv1':dde_solver_m_unix.f90.text+0x20b69): undefined reference to `_gfortran_st_write'
    :dde_solver_m_unix.f90.text+0x20b87): undefined reference to `_gfortran_transfer_character'
    :dde_solver_m_unix.f90.text+0x20b95): undefined reference to `_gfortran_st_write_done'
    (...)
    Lorsque j'utilise gfortran pour l'édition des liens j'ai l'unique message suivant:
    obj/main.o: In function `main':main.c.text+0x3b): multiple definition of `main'
    /usr/lib/gcc/i386-redhat-linux/4.1.0/libgfortranbegin.a(fmain.o): first defined here
    /usr/bin/ld: Warning: size of symbol `main' changed from 50 in /usr/lib/gcc/i386-redhat-linux/4.1.0/libgfortranbegin.a(fmain.o) to 176 in obj/main.o
    /usr/lib/gcc/i386-redhat-linux/4.1.0/libgfortranbegin.a(fmain.o): In function `main': undefined reference to `MAIN__'
    collect2: ld returned 1 exit status
    make: *** [bin/dde] Error 1
    Et enfin toujours lorsque j'utilise gfortran, si j'enlève les options de linkage (-L$(PATH_GSL)lib -lm -lgsl -lgslcblas) tout fonctionne...
    Pourtant j'ai lu dans des topics du forum qu'il fallait utiliser le compilateur correspondant au langage dans lequel est écrit le main (dans mon cas c'est le C)...

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    En fait ca semble être le -lm qui ne passe pas pour gfortran... Avec -Lm ca passe, mais en fait le -Lm sert a rien apparament pour gfortran, quand je le retire ca fonctionne quand même...
    Donc sans -lm, ou avec -Lm, ca marche avec gfortran.

    Pour gcc par contre je n'ai pâs trouvé le problème si quelqu'un à une idée qu'il n'hésite pas

  4. #4
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    as-tu essayé de changer de compilo.... je voudrais pas manqué de respect à gfortran mais.... je te conseille g95 déjà, ensuite si c'est l'édition de lien c'est qu'il y a une fonction qu'il ne connait pas que tu utilise.... je sais pas si l'otion existe dans gfortran, mais souvent lors de la compil les noms de fonction prennent un '_' en fin de nom et sous g95 par exemple, l'option '-fno_underscoring' est très pratique

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Avec gfortran pour l'édition des liens ca passe maintenant, aucun problème.
    C'est avec GCC qui ca ne passe pas, j'obtient toujours les messages cités plus haut... Ce genre de chose:
    (...)
    :essai.f90:(.text+0x89e): undefined reference to `_gfortran_st_write_done'
    :essai.f90:(.text+0x8d4): undefined reference to `_gfortran_st_write'
    :essai.f90:(.text+0x8f2): undefined reference to `_gfortran_transfer_character'
    :essai.f90:(.text+0x93c): undefined reference to `_gfortran_transfer_array'
    :essai.f90:(.text+0x94a): undefined reference to `_gfortran_st_write_done'
    collect2: ld returned 1 exit status
    Je précise que j'obtient ca même en linkan avec gcc et en compilant les sources fortran avec le compilateur f95... Le même genre d'erreur apparait lorsque je compile avec gfortran...
    Je sais pas il y a peut être une bibliotheque a ajouter pour l'édition des liens quand on utilise GCC pour faire l'édition des liens avzec des objets fortran... Ce que je sais c'est que ces fonctions qu'il ne trouve pas ne sont pas utilisées dans le code fortran que j'utilise (en tt cas pas explicitement).

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Le point d'entree du programme est en quel langage? Si c'est en C (main) tu dois faire l'edition de lien via gcc avec -lm -lg2c. Si c'est en Fortran (program), tu dois utiliser gfortran.

  7. #7
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Mon main est en C... (Et malgrés cela l'édition des liens avec gfortran fonctionne.).
    J'ai essayé avec l'option -lg2c et j'obtient:

    gcc -lm -lg2c -L/home/vince/gsl-1.9/lib -lgsl -lgslcblas obj/main.o obj/dde.o obj/utils.o obj/dde_solver_m_unix.o obj/essai.o -o bin/dde
    /usr/bin/ld: cannot find -lg2c
    collect2: ld returned 1 exit status
    make: *** [bin/dde] Error 1

  8. #8
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    je réitère donc ma remarque surtout si tu mélange du C et du fortran fait bien gaffe car à la compilation des underscores apparaissent un peu partout dans les noms de fonctions et paut très vite causer des érreur d'édition de lien...

    ce qui est bizare c'est que je croyait que gcc appelait gfortran lors de la compilation.... mais il est possible qu'il utilise un autre éditeur de liens (pas sûr du tout là dessus)

    pour ce qui est des underscore il y a un option à passé à gcc pour que tout coule bien, je me souvient plus trop mais j'ai déjà eu à faire à ce genre de Pbs....

Discussions similaires

  1. [Lazarus] Erreur édition des liens (linking) dans programme d'essais mysql
    Par over_score dans le forum Lazarus
    Réponses: 1
    Dernier message: 13/07/2009, 10h51
  2. Erreur sur l'édition des liens.
    Par Annaced dans le forum C++
    Réponses: 2
    Dernier message: 06/04/2008, 21h39
  3. Réponses: 0
    Dernier message: 20/07/2007, 13h40
  4. Erreur à l'édition des liens en mode release
    Par Deydey dans le forum Visual C++
    Réponses: 3
    Dernier message: 16/04/2007, 14h56
  5. [VC++] Erreur d'édition des liens LNK1143
    Par Yellowmat dans le forum MFC
    Réponses: 6
    Dernier message: 01/02/2006, 15h00

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