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

MFC Discussion :

Interfacer C++ et Fortan (VC++6)


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Par défaut Interfacer C++ et Fortan (VC++6)
    Salut j'ai un petit soucis de link dans une appli...
    C'est une appli en C/C++ avec des appels à du fortran. Et dans le fortran il y a aussi des appels à du C++, et c'est là qu'arrive mon problème...

    j'ai trouvé un sujet qui semblait correspondre à mon problèmes mais ça ne marche toujours pas

    voici mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ferfa.obj : error LNK2001: unresolved external symbol _ferfa_c_
    Je compile sous Visual C++ 6,
    voici mes options de compil (.dsp)
    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
    30
    # PROP BASE Use_MFC 0
    # PROP BASE Use_Debug_Libraries 0
    # PROP BASE Output_Dir "clc___Win32_Debug"
    # PROP BASE Intermediate_Dir "clc___Win32_Debug"
    # PROP BASE Ignore_Export_Lib 0
    # PROP BASE Target_Dir ""
    # PROP Use_MFC 0
    # PROP Use_Debug_Libraries 0
    # PROP Output_Dir "../lib/Debug"
    # PROP Intermediate_Dir "clc___Win32_Debug"
    # PROP Ignore_Export_Lib 0
    # PROP Target_Dir ""
    # ADD BASE F90 /browser /compile_only /dll /nologo /warn:nofileopt
    # ADD F90 /browser /check:bounds /compile_only /convert:ibm /debug:full /iface:cref /include:"clc___Win32_Debug/" /dll /libs:dll /nologo /reentrancy:threaded /threads /warn:argument_checking /warn:nofileopt
    # SUBTRACT F90 /noaltparam
    # ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "../include" /I "$(CASROOT)/inc" /D "WNT" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CLC_EXPORTS" /FR /YX /FD /c
    # ADD CPP /nologo /MD /w /W0 /Gm- /GX /ZI /Od /I "../include" /I "$(CASROOT)/inc" /I "../include/libxml" /D "WNT" /D "WIN32" /D "DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CLC_EXPORTS" /FR /YX /FD /c
    # SUBTRACT CPP /WX
    # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
    # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
    # ADD BASE RSC /l 0x419 /d "NDEBUG"
    # ADD RSC /l 0x419 /d "NDEBUG"
    BSC32=bscmake.exe
    # ADD BASE BSC32 /nologo
    # ADD BSC32 /nologo
    LINK32=link.exe
    # ADD BASE LINK32 TKIGES.lib TKXSBase.lib TKShHealing.lib TKernel.lib TKMath.lib TKG2d.lib TKG3d.lib TKGeomBase.lib TKBRep.lib TKGeomAlgo.lib TKTopAlgo.lib TKBool.lib TKFillet.lib TKOffset.lib TKFeat.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../lib/sumokernel_clc.dll" /libpath:"$(CASLIB)"
    # SUBTRACT BASE LINK32 /pdb:none
    # ADD LINK32 TKIGES.lib TKXSBase.lib TKShHealing.lib TKernel.lib TKMath.lib TKG2d.lib TKG3d.lib TKGeomBase.lib TKBRep.lib TKGeomAlgo.lib TKTopAlgo.lib TKBool.lib TKFillet.lib TKOffset.lib TKFeat.lib libxml2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /debug /machine:I386 /out:"../lib/Debug/kernel_clc.dll" /pdbtype:sept /libpath:"$(CASLIB)" /libpath:"../include/libxml"
    # SUBTRACT LINK32 /pdb:none
    fichier export1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifndef Standard_EXTERNC_ 
    # define Standard_EXTERNC_ extern "C"
    #endif
    fichier fortran.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define ferfa_ FERFA
    Standard_EXTERNC_ void ferfa_(void);
    Voici l'appel de la fonction en fortran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BaseAu.cxx
    #include <fortran.h>
    ...
    int fermerBaseAu(void)
    { 
      ...
      ferfa_();
      //FERFA();
      ...
    }
    Voici ma fonction fortan qui appelle du C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ferfa.f
          SUBROUTINE FERFA
    	INCLUDE "wininter.inc"
          INTEGER CODE
          CODE=0
     
          CALL FERFA_C(CODE)
     
          RETURN
          END
    et le fichier wininter.inc inclus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    C---------------------------------------------------
    C Interface FORTRAN / C pour la fonction FERFA_C 
    C---------------------------------------------------
          INTERFACE
          FUNCTION FERFA_C(CODE)
    !DEC$ ATTRIBUTES C , ALIAS:'_ferfa_c_' :: FERFA_C
          INTEGER CODE
    !DEC$ ATTRIBUTES REFERENCE ::CODE
          END FUNCTION FERFA_C
          END INTERFACE
    ...
    ... et la fonction C++ appelée
    fichier Au.cxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ferfa_c_(int * code)
    {
        printf("--> ferfa_c_");
        ...
    }
    ce qui me donne cette sublime erreur de link

    Quelqu'un aurait-il une solution svp?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Par défaut
    j'ai plus ou moins trouvé une réponse, en renommant mon fichier Au.cxx en Au.c... (plus d'erreur de link)
    Par contre je ne sais pas pourquoi ça ne marche pas avec le .cxx, donc si quelqu'un peut m'éclairer, je lui serais reconnaissant

  3. #3
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Il faut faire attention aux conventions d'appel des fonctions lors d'une importation / exportation :

    il y a __cdecl, __stdcall et __fastcall

    Chaque type donne lieu a une decoration du nom differente (un _ ou un @ en préfixe ...)

    --> se référer a l'aide en ligne de VS pour plus de détails.

    ou ici : http://www.codeproject.com/cpp/calli...emystified.asp

    Mais je pense que ça peut venir de là

    @+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Par défaut
    salut,
    Merci pour ta réponse
    Effectivement ça pourrait venir des conventions d'appel puisque j'essaie d'intégrer du code avec des __cdecl, à du code avec des __stdcall.
    J'ai fait quelques tests en mettant du __stdcall, et en repassant les extensions de mes nouveaux fichier à cxx, mais ça n'a rien donné... Je en sais pas si j'ai loupé quelquechose, mais je me dit que tant pis, après tout ça a l'air de marcher en gardant des fichiers .c alors je ne vais pas passer plus de temps sur ce problème... parce que j'en ai d'autres maintenant ^^.

Discussions similaires

  1. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  2. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  3. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27
  4. [VB6] [Interface] Tester le Type de Controle
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/09/2002, 09h51
  5. [VB6] [Interface] Icones de boutons de barre d'outils
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 13/09/2002, 15h50

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