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

C++ Discussion :

appel fortran sous C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut appel fortran sous C++
    bonjour,

    Je cherche a appeler une librairie fortran avec du C++.
    Voici mon programme test en C++ (sous code-blocks)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    using namespace std;
     
    extern "C"  void adding_(double *x);
     
    int main()
    {
        double bar = 1.00;
        cout << bar << endl;
        adding_(&bar);
        cout << bar << endl;
        return 0;
    }
    Voici mon code Fortran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          SUBROUTINE ADDING(FOO)        
          REAL(8) FOO      
          FOO = FOO * 2        
          return    
          END
    Apres compilation du fichier fortran, je recupere le .o et je le place dans obj/Debug. Le message d'erreur est du compilateur C++ est

    undefined reference for '_adding_'
    Apparemment le C++ ajoute l'underscore en debut des noms pendant la compilation. Peut-on desactiver cet ajout automatique ? Ou alors peut-on demander au fortran d'ajouter l'underscore ? (si on ajoute le _ dans le nom de la fonction le compilateur fortran plante)

    Je ne sais pas comment faire ! Pouvez-vous m'aider ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 482
    Par défaut
    Pas tester mais à essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" { __cdecl void adding_(double *x);}

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    L'underscore est déjà une décoration C __cdecl.
    • __cdecl: _adding_
    • __stdcall: _adding_@4 (en 32 bits)
    • __fastcall sous Visual: @adding_@4 (en 32 bits).

    Il n'y a aucun moyen à ma connaissance de le supprimer côté "code utilisateur".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    Tu peux voir la liste des symboles d'un fichier objet avec l'outil nm.
    Dans le fichier objet de ton fichier C++ tu devrais trouver "U adding_" et dans celui en fortran "T adding_".
    Qu'est ce que tu as ?
    Et t'es sûr qu'il suffise de mettre ton fichier objet dans ton "obj/Debug" pour que le linker le prenne en entrée ?

  5. #5
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Merci pour vos reponses, c'est instructif ...
    Twindruff, en utilisant la commande nm avec Cygwin (je suis sous Windows) voici ce que j'obtiens :

    $ nm test.o
    00000000 b .bss
    00000000 d .data
    00000000 t .text
    00000000 T _adding_
    On retrouve le meme nom _adding_ que dans le message d'erreur du compilateur c++.

    Mais alors, si les decorations de nom sont correctes où est l'erreur ? C'est le parametrage de mon IDE qui n'est pas bon ?

  6. #6
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 197
    Par défaut
    Ca y est j'ai trouvé !

    En fait c'est une erreur un peu stupide...

    J'avais bien mis mon fichier test.o dans le répertoire obj/Debug mais sans l'inclure dans le projet au niveau de l'IDE. C'est fait, et plus d'erreurs au moment de la compilation.

    En tout cas merci j'aurais appris des trucs..

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/07/2012, 20h30
  2. Réponses: 1
    Dernier message: 02/12/2011, 12h53
  3. [C++] Comment effectuer l'appel system sous pocket pc ?
    Par Startux dans le forum Windows Mobile
    Réponses: 8
    Dernier message: 20/07/2006, 10h43
  4. [VBA]localiser un appel fonction sous excel
    Par random dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/01/2006, 10h09

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