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 :

Utilisation d'une librairie Fortran


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut Utilisation d'une librairie Fortran
    Bonjour.

    J'essaye actuellement d'utiliser des fichiers Fortran dans mon code C++. Utilisant Visual Studio 2005 j'ai réussi à générer une dll et un .lib de mon code Fortran.

    Cependant je ne sais pas de un comment l'insérer dans mon projet C++ et de deux comment appeler les fonctions définies dans ma librairie.

    Si quelqu'un pouvait m'aider ca serait tres gentil parceque je m'en sors pas

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Eh bien normalement, il suffit d'ajouter le .lib au projet et de déclarer les fonctions correspondantes (généralement dans un fichier d'en-tête)...
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut ca marche pas
    Avant tout merci pour ton aide. Sinon c'est ce que j'ai fait mais pour une obscure raison cela ne marche pas.

    J'ai rajouter mon .lib dans le projet (Properties->Configuration Properties->C/C++->General->Additionnal Include Directories sous Visual Studio 2005).

    Mon code fortran est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            MODULE FONCTION_mod
              INTERFACE 
                SUBROUTINE FONCTION(CHAINE,LG_CHAINE,REEL)
                  INTEGER(KIND=4), INTENT(INOUT) :: LG_CHAINE
                  CHARACTER(LEN=LG_CHAINE), INTENT(INOUT) :: CHAINE
                  REAL(KIND=4), INTENT(INOUT) :: REEL
                END SUBROUTINE FONCTION
              END INTERFACE 
            END MODULE FONCTION_mod
    Le lanczos.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" void fonction_ (char *, int*, float*);
    le lanczos.cpp
    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
     
    #include <iostream> 
    #include "lanczos.h"
     
    using namespace std;
     
    void main()
    {
      int   lg_chaine  = 0;
      float reel       = 0.0;
      char  chaine[]   = "chaine_C++";
     
      lg_chaine = strlen(chaine);
      fonction_ (chaine, &lg_chaine, &reel);
     
      cout << "chaîne finale          = " << chaine << endl;
      cout << "longueur de la chaîne  = " << lg_chaine << endl;
      cout << "réel passé par adresse = " << reel << endl;
    }
    Et enfin mon erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1>------ Début de la génération : Projet : testFortran, Configuration : Debug Win32 ------
    1>Édition des liens en cours...
    1>lanczos.obj : error LNK2019: symbole externe non résolu _fonction_ référencé dans la fonction _main
    1>MSVCRTD.lib(crtexew.obj) : error LNK2019: symbole externe non résolu _WinMain@16 référencé dans la fonction ___tmainCRTStartup
    1>C:\Documents and Settings\Fabien\Mes documents\Visual Studio 2005\Projects\testFortran\Debug\testFortran.exe : fatal error LNK1120: 2 externes non résolus
    1>Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\Fabien\Mes documents\Visual Studio 2005\Projects\testFortran\testFortran\Debug\BuildLog.htm"
    1>testFortran - 3 erreur(s), 0 avertissement(s)
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Include != Library.

    Tu dois rajouter le .lib dans Properties->Configuration Properties->Linker->Input->Additional Dependencies.
    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.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    Je l'ai fait aussi mais ca ne change rien

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Change le sous-système de ton projet de WINDOWS à CONSOLE (dans les options du linker), puisque tu as un main() et non un WinMain().
    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.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    aucune différence

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Je peux voir tes derniers messages d'erreurs ?
    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.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Es-tu sûr que la fonction fortran est bel et bien exportée sous le nom "fonction_", casse comprise ?
    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.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    oui oui je t'ai collé exactement le code de mon fichier.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Tu veux dire que le fichier .h a été généré automatiquement ?

    (désolé si je pose une question débile, mais je ne connais pas les conventions de nommage/décoration de Fortran. Je ne connais que les trois conventions de décoration C de Windows...)
    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.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    non c'est moi qui ait créé le fichier .h

    Mais pour etre plus clair dans mon fichier fortran a partir duquel j'ai fait mon fichier .lib la fonction s'appelle fonction.

    Et j'ai lu que pour y accéder en c++ on devait la déclarer en fonction_.

    ps: j'ai essayé en mettant fonction au lieu de fonction_ dans le .h mais ca ne marche pas non plus

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    pour info je m'inspire de ce lien la

    http://www.idris.fr/su/Vectoriel/bro...rtran_C++.html

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Eh bien pour commencer, mets le nom de ta fonction fortran en minuscules...
    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.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    en fait dans mon fichier mon code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SUBROUTINE fonction (chaine, lg_chaine, reel)
     
      CHARACTER(LEN=lg_chaine), INTENT(INOUT) :: chaine
      INTEGER,                  INTENT(INOUT) :: lg_chaine
      REAL,                     INTENT(INOUT) :: reel
     
      chaine    = TRIM(chaine) // ' et chaine_Fortran'
      lg_chaine = LEN_TRIM(chaine)
      reel      = 100.0
     
    END SUBROUTINE fonction
    Sauf que Visual Studio 2005 semble le transformer lors de l'application en celui ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            !COMPILER-GENERATED INTERFACE MODULE: Sun Nov 25 16:32:18 2007
            MODULE FONCTION_mod
              INTERFACE 
                SUBROUTINE FONCTION(CHAINE,LG_CHAINE,REEL)
                  INTEGER(KIND=4), INTENT(INOUT) :: LG_CHAINE
                  CHARACTER(LEN=LG_CHAINE), INTENT(INOUT) :: CHAINE
                  REAL(KIND=4), INTENT(INOUT) :: REEL
                END SUBROUTINE FONCTION
              END INTERFACE 
            END MODULE FONCTION_mod
    DU coup j'ai changé mon appel de fonction en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      FONCTION (chaine, &lg_chaine, &reel);
    La bonne nouvelle c'est que je n'ai plus la meme erreur. La mauvaise c'est qui lui manquait des .lib pr compiler. Je rajouter donc le chemin des .lib (Intel Fortran) et j'obtiens:

    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
    1>------ Début de la génération : Projet : testFortran, Configuration : Debug Win32 ------
    1>Édition des liens en cours...
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(tidtable.obj) : error LNK2005: __encode_pointer déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(tidtable.obj) : error LNK2005: __decode_pointer déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a déjà défini(e) dans MSVCRTD.lib(cinitexe.obj)
    1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z déjà défini(e) dans MSVCRTD.lib(cinitexe.obj)
    1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a déjà défini(e) dans MSVCRTD.lib(cinitexe.obj)
    1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z déjà défini(e) dans MSVCRTD.lib(cinitexe.obj)
    1>LIBCMT.lib(setlocal.obj) : error LNK2005: __configthreadlocale déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(mlock.obj) : error LNK2005: __lock déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type déjà défini(e) dans MSVCRTD.lib(MSVCR80D.dll)
    1>LINK : warning LNK4098: conflit entre la bibliothèque par défaut 'MSVCRTD' et les autres bibliothèques ; utilisez /NODEFAULTLIB:library
    1>LINK : warning LNK4098: conflit entre la bibliothèque par défaut 'LIBCMT' et les autres bibliothèques ; utilisez /NODEFAULTLIB:library
    1>MSVCRTD.lib(crtexew.obj) : error LNK2019: symbole externe non résolu _WinMain@16 référencé dans la fonction ___tmainCRTStartup
    1>C:\Documents and Settings\Fabien\Mes documents\Visual Studio 2005\Projects\testFortran\Debug\testFortran.exe : fatal error LNK1120: 1 externes non résolus
    1>Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\Fabien\Mes documents\Visual Studio 2005\Projects\testFortran\testFortran\Debug\BuildLog.htm"
    1>testFortran - 19 erreur(s), 2 avertissement(s)
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    Il y a un conflit entre la version statique et la version dynamique de la CRT.
    Va dans les proptiétés de ton projet, et change l'option dans ton projet pour que ça corresponde
    Project Properties -> Configuration Properties -> C/C++ -> Code Generation -> Runtime Library.
    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.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    J'ai testé les quatres différentes valeurs (Multithread, debuggage Multithread, Dll Multithread, Dll de debuggage Multithread) et ca fait aucune différence.

    J'ai également essayé de mettre l'option /NODEFAULTLIB:library comme il est dit dans les erreurs mais du coup plus aucune fonction n'est reconnu...please help

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'une librairie Fortran
    Par alexiel_ad dans le forum Fortran
    Réponses: 4
    Dernier message: 13/11/2007, 20h59
  2. [FB] utilisation d'une librairie C/C++
    Par dug dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 16/10/2006, 22h05
  3. [GD] Utilisation d'une librairie equivalente à Gd/installation sans reboot du serveur
    Par hokidoki dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 21/07/2006, 15h22
  4. Utilisation d'une librairie
    Par LordBob dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 20/07/2006, 14h06
  5. Réponses: 4
    Dernier message: 13/10/2005, 12h41

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