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++

  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 504
    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 504
    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 397
    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 397
    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