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 :

code::block Pb de compilation


Sujet :

Fortran

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut code::block Pb de compilation
    Bonjour à tous,

    Dans le cadre de mon travail, je suis amené à programmer en fortran sous windows (chez moi) (j'utilise le compilateur gfortran et l'IDE CODE::BLOCKS. Au bureau, j'utilise Ubuntu et aussi le compilateur gfortran mais bien sûr en ligne de commande.

    Je possède un code (code minimal qui reproduit mon problème) composé d'un seul module hello.f90 et d'un programme principal (main.f90) qui fait naturellement appel au précédent module. Voici les deux morceaux de code en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    !------------------
    ! main.f90
    !------------------
     
    INCLUDE "hello.f90"
     
    PROGRAM salut
    use NBR
    print*, 'hello ------> a =', a
    end PROGRAM salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    !----------------------
    ! Le module hello.f90
    !----------------------
     
    MODULE NBR
    IMPLICIT NONE
    INTEGER :: a = 2
    END MODULE NBR
    Au bureau, il me suffit de compiler d'abord le module pour créer hello.o et hello.mod puis je compile le programme principal afin de créer l’exécutable a.out :

    toto@ >> gfortran -c hello.f90
    toto@ >> gfortran main.f90
    toto@ >> ./a.out

    Tout marche parfaitement bien donc sous linux en ligne de commande avec gfortran.

    Chez moi, j'utilise l'interface graphique de CODE::BLOCKS sous windows 7.
    Voici brièvement la configuration

    Settings / Compiler and debugger / Toolchain executables
    C compiler : gfortran.exe
    C++ : g++.exe
    Linker for dynamic libs : gfortran.exe
    Linker for static libs : ar.exe
    Debugger : gdb.exe
    Resource compiler : VIDE
    Make program : make.exe

    Pour compiler d'abord mon module, j'utilise la fonction Build / Compile current file : ce qui marche
    parfaitement bien et me créé hello.o et hello.mod ...

    De la même façon, je compile le programme principal mais malheureusement aucun exécutable n'est crée. En cliquant ensuite sur build (petite roue jaune) pour construire mon projet, j'obtiens le message suivant m’empêchant d'aller plus loin


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Linking console executable: bin\Release\toto.exe
    obj\Release\hello.o:hello.f90:(.data+0x0): multiple definition of `__nbr_MOD_a'
    obj\Release\main.o:main.f90:(.data+0x0): first defined here
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Je rappelle que tout marche très bien en ligne de commande sous Linux mais pas avec code:blocks sous windows 7.

    Comment demander à CODE::BLOCKS de me compiler le programme principal mais en prenant en compte le fait ce que programme appelle un module ? Je vois pas du tout comment configurer la bête pour y arriver...

    Par ailleurs, y a t-il un moyen d'utiliser code:blocks sous windows en ligne de commande comme on le ferait sous linux (avec les mêmes syntaxes) ?

    Merci beaucoup

    Antoine

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Le problème est que le module est défini en double. Il est défini dans hello.f90 et dans main.f90 via le include.

    Quand tu fais :
    Citation Envoyé par Casimirs Voir le message
    toto@ >> gfortran -c hello.f90
    toto@ >> gfortran main.f90
    toto@ >> ./a.out
    La première ligne est tout à fait inutile puisque le code de hello est déjà dans main.f90. Le fichier .mod créé par gfortran -c hello.f90 est remplacé par la compilation du module inclu dans main.f90.

    Quand tu compile le projet via un IDE, il ajoute hello.o à main.o pour assembler le programme et là, il y a double définition. En gros, il fait :

    toto@ >> gfortran -c hello.f90
    toto@ >> gfortran -c main.f90
    toto@ >> gfortran main.o hello.o

    Si tu essaies, tu observeras le même message.

    Pour corriger, il y a 2 solutions :
    • Tu enlèves le include. C'est la solution pour les moyens ou gros projets.
    • Tu copies le code de hello.f90 à la place du include, tu élimine hello.f90, et tu maintiens seulement main.f90. C'est la solution que je préfère pour les petits projets.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Bonjour Sylvain,

    Je te remercie pour ta réponse. Effectivement tout marche bien maintenant comme tu le dis.
    La ligne contenant le INCLUDE du programme principal est redondante et cela est à l'origine des problèmes évoqués.

    Cependant, je suis un peu perdu car dans les exemples traités dans mes vieux cours de FORTRAN et ceux qu'on peut trouver sur le net, le programme principal est toujours précédé en entête d'une serie de INCLUDE reprenant les modules externes

    INCLUDE "code_1.f90"
    INCLUDE "code_2.f90"

    Quand est-ce que ce INCLUDE est nécessaire ? Pour les fonctions définies ailleurs que dans le programme principal ?

    Je pense finalement qu'on doit être pas mal ici à inclure dans le programme principal les modules externes par des "INCLUDE" à tout va en début de code...

    Encore merci !

    Antoine

Discussions similaires

  1. Réponses: 18
    Dernier message: 16/12/2008, 19h53
  2. Code::Blocks, Libpurple et compilation
    Par azman0101 dans le forum Linux
    Réponses: 0
    Dernier message: 25/08/2007, 17h46
  3. Réponses: 3
    Dernier message: 27/04/2007, 17h30
  4. [Code::Blocks]Options de compilation de gcc
    Par Marco85 dans le forum Code::Blocks
    Réponses: 2
    Dernier message: 28/02/2006, 10h16

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