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 :

Appel à une DLL dev. en C depuis du code Fortran


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Par défaut Appel à une DLL dev. en C depuis du code Fortran
    Bonjour,

    Je souhaite en ce moment faire appel à une routine d'une DLL développée en C depuis un programme Fortran (Je sais le faire mais de Fortran à Fortran..). Et je rencontre le message suivant:

    - sous Compaq Visual Studio:

    Linking...
    Creating library Debug/Xxxxx.lib and object Debug/Xxxxx.exp
    xxx.obj : error LNK2001: unresolved external symbol _MAROUTINEENC@28
    Debug/Xxxxx.dll : fatal error LNK1120: 1 unresolved externals

    - sous Visual Studio 2005 (compiler Intel 10.1.024)

    Erreur 1 error LNK2019: symbole externe non résolu _MAROUTINEENC référencé dans la fonction _FONCTIONAPPELANTE xxx.obj
    Erreur 2 fatal error LNK1120: 1 externes non résolus Debug\Xxxxx.dll


    Voici le morceau de code de la DLL en C appelé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
     
    #define DLL_EXPORT __declspec(dllexport)
     
    ...
     
    void DLL_EXPORT maroutineenC(int *arg0, char *arg1, char *arg2, char *arg3)
    {
       ...
    }
    Voici le code Fortran appelant:
    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
     
           ...
     
           interface
     		subroutine maroutineenC(arg0, arg1, arg2, arg3)
    			character*200,intent(in) :: arg1
    			character*20,intent(in) :: arg2
    			character*20,intent(in) :: arg3
     	                integer*4,intent(out) :: arg0
     
     	        !DEC$ ATTRIBUTES DLLEXPORT :: maroutineenC
     	        !DEC$ ATTRIBUTES REFERENCE :: arg0, arg1, arg2, arg3
     	    end subroutine 
     	end interface
     
           ...
     
         character*200,intent(in) :: arg1
         character*20,intent(in) :: arg2
         character*20,intent(in) :: arg3
         integer*4,intent(out) :: arg0
     
         arg1= 'Test.txt'//char(0)
         arg2= 'BLABLA'//char(0)
         arg2= 'Salut'//char(0)
     
         call maroutineenC(arg0, arg1, arg2, arg3)
     
         ...
    Pour information:

    - Les fichiers maDLLenC.dll et maDLLenC.lib sont bien attachés au projet.
    - J'ai également testé en ajoutant la syntaxe "pointeur" dans la déclaration de l'interface dans le code Fortran:
    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
     
           ...
     
           interface
     		subroutine maroutineenC(arg0, arg1, arg2, arg3)
    			character, pointeur, intent(in) :: arg1
    			character, pointeur, intent(in) :: arg2
    			character, pointeur, intent(in) :: arg3
     	                integer*4, pointeur, intent(out) :: arg0
     
     	        !DEC$ ATTRIBUTES DLLEXPORT :: maroutineenC
     	        !DEC$ ATTRIBUTES REFERENCE :: arg0, arg1, arg2, arg3
     	    end subroutine 
     	end interface
     
           ...
    mais sans changements...

    Auriez-vous des idées SVP ?

    Cordialement,

  2. #2
    Membre émérite 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
    Par défaut
    je ne connais pas bien le compilateur intel (moi, je travail avec gcc/gfortran) mais souvent cela vient du underscore: un compilo va donner

    "_maroutineenc_" et l'autre cherche une fonction nomé "_maroutineenc" du coup il ne la trouve pas...
    de plus, idéalement il faut des compilateur C et Fortran qui ait des formats de sortie compatible par exemple un fortran compilé avec ifort ne comprend pas les lib compilées avec gcc

    je commencerai par chercher les options d'underscoring et de vérifier qu'à l'édition de liens les fichiers dll et lib sont bien pris en compte par le compilo ( pas seulement "intégré au projet" ) de plus il me semble que sous visual studio il faut bien configurer entre lib static et dynamique...

Discussions similaires

  1. Appeler une dll C# depuis VBA
    Par doudblast dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 17/08/2009, 15h07
  2. Appeler une dll ou un autre module vba depuis une macro excel vba
    Par technobiz dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/11/2008, 14h24
  3. Réponses: 5
    Dernier message: 08/08/2008, 14h48
  4. Appeler une DLL depuis Javascript
    Par troubleshooting dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/07/2008, 14h45
  5. appeler une DLL depuis un executable
    Par xxiemeciel dans le forum Framework .NET
    Réponses: 10
    Dernier message: 09/07/2007, 14h42

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