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 :

[Débutant] - Accès à une fonction d'une DLL depuis F90


Sujet :

Fortran

  1. #1
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    août 2010
    Messages
    642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : août 2010
    Messages : 642
    Points : 1 135
    Points
    1 135
    Par défaut [Débutant] - Accès à une fonction d'une DLL depuis F90
    Salut,

    Je suis complètement novice en Fortran. En fait, c'est pire que cela car je code depuis longtemps uniquement en Python. Donc je n'ai aucune notion correcte de pointer, d'espace mémoire, de compilation...

    Pour un besoin professionnel je souhaite recompiler un code Fortran (f90) pour en faire une DLL. Ce code avait été compilé il y a plusieurs années par un collègue qui ne bosse plus dans mon département et pour un architecture 32bits. Cette DLL est ensuite utilisée par un programme commercial. Voilà pour la petite histoire.

    J'ai commencé par faire une compilation à la sauvage sans trop regarder comment ça marche. Et bien entendu le résultat n'est pas fonctionel. Le programme commercial en question n'est pas bavard, mais il semble indiquer qu'il ne trouve pas la routine voulue dans la DLL que j'ai compilée. Je me suis donc dis que je devrais repartir d'un exemple plus simple, dont l'architecture se rapproche du code final.

    Je sèche sur le problème suivant : compiler un code Fortran contenant une seule fonction (ou routine, au choix) en une DLL puis appeller cette fonction par un autre code. Voilà ce que j'ai fait :

    Le code Fortran add.f90 (avec le décorateur, car j'ai l'impression que c'est ça qui permet d'accéder ensuite à la fonction depuis l'extérieur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function add(x, y)
        !DEC$ ATTRIBUTES DLLEXPORT :: add
        real             :: add
        real, intent(in) :: x, y
        add = x + y
    end function add
    La compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gfortan -c add.f90
    gfortran -shared -o add.so add.o
    Le code externe appelant la DLL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import ctypes
     
    libc = ctypes.CDLL('add.so')
    print(libc.add(1.2, 3))
    Oui, je fais des tests sur mon PC perso sous linux, d'où l'extension .so. Mon PC de travail est sous Windows 7 et j'utiliserais gfortan également, fourni par mingw (dernière version en date). Le code appelant la library est du Python. Le message d'erreur renvoyé par son exécution est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: add.so: undefined symbol: add
    Là encore j'ai l'impression que la fonction add n'est pas trouvée. Je ne comprends pas comment faire l'export proprement. Est-ce lié au compilateur ?

    J

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    décembre 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 67
    Points : 436
    Points
    436
    Billets dans le blog
    1
    Par défaut F2PY ?
    Bonjour Julien,

    je n'ai pas d'expérience dans la création de librairies en Fortran, encore moins sous Windows (DLL).

    Mais je pense à deux choses :

    1. Python étant codé en C, peut-être faut-il utiliser les mécanismes ISO_C_BINDING du Fortran 2003 ? Voir https://gcc.gnu.org/onlinedocs/gfortran/ISO_005fC_005fBINDING.html
      https://stackoverflow.com/questions/...routine-from-c
    2. Je regarderais du côté de F2PY –Fortran to Python interface generator– (https://docs.scipy.org/doc/numpy/f2py/). Voir aussi : https://stackoverflow.com/questions/...dule-with-f2py


    En espérant que ça puisse t'aider.

    Vincent

  3. #3
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    août 2010
    Messages
    642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : août 2010
    Messages : 642
    Points : 1 135
    Points
    1 135
    Par défaut
    Salut Vincent.

    Merci pour ta réponse. Ici je n'utilise Python que pour tester l'appel à la fonction compilée. Juste pour bien comprendre comment ça marche. La DLL sera appelée par un logiciel tier.

    J'ai testé l'ajout de use ISO_C_BINDING, mais cela ne semble pas faire de différence.

    Par contre j'ai eu du mieux en rajoutant l'option -fPIC à la compilation. Si je teste le contenu de ma bibliothèque, add.so, avec la commande nm -D add.so j'obtiens désormais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    00000000000010f9 T add_
                     w __cxa_finalize
                     w __gmon_start__
                     w _ITM_deregisterTMCloneTable
                     w _ITM_registerTMCloneTable
    Un net progrès car je peux appeler add_ depuis Python. L'ajout de cet underscore semble classique. J'ai essayé de m'en débarasser en rajoutant l'attribut ALIAS du décorateur, mais en vain :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function add(x, y)
        !DEC$ ATTRIBUTES DLLEXPORT, ALIAS:'add' :: add
     
        real             :: add
        real, intent(in) :: x, y
        add = x + y
    end function add
    C'est sur la bonne voie.

    EDIT
    Bon ben apparemment il "suffirait" d'ajouter l'option -fno-underscoring tout simplement.

    J

Discussions similaires

  1. Exécuter une fonction d'une dll depuis VBA
    Par pijaku dans le forum Contribuez
    Réponses: 0
    Dernier message: 10/08/2017, 10h37
  2. Réponses: 3
    Dernier message: 31/08/2008, 16h33
  3. Réponses: 1
    Dernier message: 06/10/2006, 10h21
  4. Accés à une dll externe
    Par syrio dans le forum C++
    Réponses: 5
    Dernier message: 07/04/2006, 23h23
  5. Communiquer avec une DLL depuis un driver .SYS
    Par barthelv dans le forum Windows
    Réponses: 17
    Dernier message: 03/04/2006, 10h43

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