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

MATLAB Discussion :

Compilation mixte de C et de Fortran [MEX]


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut Compilation mixte de C et de Fortran
    Bonjour-bonjour !

    J'ai un programme Matlab qui fait appel a des mex-files. Les mex-files ont été compilés sous Unix et mon travail est de le faire sous Windows. J'ai des routines Fortran et la fonction "Gateway" (fonction qui fait le lien entre Matlab et les routines Fortran) en C

    Quand on compile sous Unix, on peut mélanger C et Fortran, il "suffit" donc de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mex loiglpattdir.c glpattdir2.F initbr.F filin.F dirfin.F mindowson.F huilemax.F couple_came.F diff_Ccame_ad.F dico_Ccame_ad.F maths.F trtbr.F
    Sous Windows, mex ne peut prendre que des fichiers C ou que des Fortran. J'ai donc compilé toutes mes sources Fortran en .obj (et j'ai déjà bien galéré !) et pour créer le mex-file, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mex loiglpattdir.c glpattdir2.obj initbr.obj filin.obj dirfin.obj mindowson.obj huilemax.obj couple_came.obj diff_Ccame_ad.obj dico_Ccame_ad.obj maths.obj trtbr.obj
    Et là, Matlab me renvoie :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     This is mex, Copyright 1984-2005 The MathWorks, Inc. 
     
    -> Default options filename found in C:\Documents and Settings\e332442\Application Data\MathWorks\MATLAB\R14SP3 
    ---------------------------------------------------------------- 
    ->    Options file           = C:\Documents and Settings\e332442\Application Data\MathWorks\MATLAB\R14SP3\mexopts.bat 
          MATLAB                 = c:\palette\apl\matlabv7r3 
    ->    COMPILER               = cl 
    ->    Compiler flags: 
             COMPFLAGS           = -c -Zp8 -G5 -GR -W3 -DMATLAB_MEX_FILE -nologo 
             OPTIMFLAGS          = /MD -O2 -Oy- -DNDEBUG 
             DEBUGFLAGS          = /MDd -Zi -Fd"loiglpattdir.mexw32.pdb" 
             arguments           =  
             Name switch         = /Fo 
    ->    Pre-linking commands   =  
    ->    LINKER                 = link 
    ->    Link directives: 
             LINKFLAGS           = /dll /export:mexFunction /MAP /LIBPATH:"c:\palette\apl\matlabv7r3\extern\lib\win32\microsoft" libmx.lib libmex.lib libmat.lib /implib:_lib6824.x /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 
    	 LINKDEBUGFLAGS      = /DEBUG /PDB:"loiglpattdir.mexw32.pdb" 
             LINKFLAGSPOST       =  
             Name directive      = /out:"loiglpattdir.mexw32" 
             File link directive =  
             Lib. link directive =  
             Rsp file indicator  = @ 
    ->    Resource Compiler      = rc /fo "mexversion.res" 
    ->    Resource Linker        =  
    ---------------------------------------------------------------- 
     
     
    --> "cl  -c -Zp8 -G5 -GR -W3 -DMATLAB_MEX_FILE -nologo /FoC:\DOCUME~1\e332442\LOCALS~1\Temp\loiglpattdir.obj -Ic:\palette\apl\matlabv7r3\extern\include -Ic:\palette\apl\matlabv7r3\simulink\include /MD -O2 -Oy- -DNDEBUG loiglpattdir.c" 
     
    loiglpattdir.c 
    loiglpattdir.c(111) : warning C4013: 'glpattdir2' undefined; assuming extern returning int 
        Contents of 6824_tmp.rsp: 
      C:\DOCUME~1\e332442\LOCALS~1\Temp\loiglpattdir.obj  glpattdir2.obj  initbr.obj  filin.obj  dirfin.obj  mindowson.obj  huilemax.obj  couple_came.obj  diff_Ccame_ad.obj  dico_Ccame_ad.obj  maths.obj  trtbr.obj 
     
     
    --> "link /out:"loiglpattdir.mexw32" /dll /export:mexFunction /MAP /LIBPATH:"c:\palette\apl\matlabv7r3\extern\lib\win32\microsoft" libmx.lib libmex.lib libmat.lib /implib:_lib6824.x /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  @6824_tmp.rsp  " 
     
    Microsoft (R) Incremental Linker Version 6.00.8447 
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved. 
     
    C:\DOCUME~1\e332442\LOCALS~1\Temp\loiglpattdir.obj glpattdir2.obj initbr.obj filin.obj dirfin.obj mindowson.obj huilemax.obj couple_came.obj diff_Ccame_ad.obj dico_Ccame_ad.obj maths.obj trtbr.obj  
       Creating library _lib6824.x and object _lib6824.exp 
    LINK : warning LNK4098: defaultlib "msvcrtd.lib" conflicts with use of other libs; use /NODEFAULTLIB:library 
    loiglpattdir.obj : error LNK2001: unresolved external symbol _glpattdir2 
    loiglpattdir.mexw32 : fatal error LNK1120: 1 unresolved externals 
     
      C:\PALETTE\APL\MATLABV7R3\BIN\MEX.PL: Error: Link of 'loiglpattdir.mexw32' failed. 
     
    ??? Error using ==> mex
    Unable to complete successfully
    A ce que je comprends (loiglpattdir.obj : error LNK2001: unresolved external symbol _glpattdir2), il ne trouve pas ma fonction fortran "glpattdir2"...

    Un idée de ce que je n'ai pas ou mal fait ?

    Merci d'avance,
    ZeFMG.

  2. #2
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    'glpattdir2' est dans le code fortran deja compile si je comprends bien.
    Pour que tu puisses l'appeler depuis C, il faut d'abord que tu declares son prototype en C en specifiant le mot clef: extern "C"

    par example, supposant que ta fonction 'glpattdir2' prenne deux entiers en parametres (attention, les parametres sont toujours passes par pointeur en fortran)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern "C" 
    void glpattdir2(int* x, int* y);
    il est aussi possible que tu doives declarer et appeler ta fonction avec un underscore (extern void _glpattdir2(int* x, int* y) (ou en meme majuscule?)... ca depend du compilateur fortran etc.. tu peux probablement verifier le nom exact de ta fonction (et sa presence) dans ton le fichier 'obj' avec la commande 'dumpbin /all glpattdir2.obj'.

    Salutations,

    Greg

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut
    au début de mon fichier C, j'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern void GLPATTDIR2(double* sortie, ...)
    et j'ai mis en majuscule l'appel à ma fonction dans le code.

    Tout marche comme sur des roulettes maintenant, merci beucoup !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/01/2010, 12h23
  2. [68k] Compilation mixte - Assembleur / C
    Par FidoDido® dans le forum Autres architectures
    Réponses: 2
    Dernier message: 10/05/2006, 19h41
  3. Réponses: 8
    Dernier message: 01/06/2005, 09h45
  4. [Fortran 77] Problème de compilation
    Par Kenji dans le forum Fortran
    Réponses: 26
    Dernier message: 23/05/2005, 16h07
  5. [Visual Fortran] Erreur de compilation
    Par Julito dans le forum Fortran
    Réponses: 1
    Dernier message: 04/03/2005, 21h24

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