Appeler fonction écrite en fortran dans matlab
Bonjour à tous,
Mon objectif est d'appeler une fonction écrite en fortran dans matlab.
Pour cela je dispose de 2 fichiers pour ma fonction en fortran: ACM552.FOR et ACM552G.FOR (c'est la Gateway Routine), de matlab 7.5 (R2007b) et d'un compilateur fortran: Intel visual fortran 9.1 (j'utilise ce compilateur car il est compatible avec matlab 7.5 d'apres ce site: http://matlab.developpez.com/faq/?pa...pilateur_liste).
Je ne connais pas grand chose aux compilateurs et aux fichiers mex mais voici la procédure que j'ai suivis pour essayer de créer un fichier mex qui puisse etre appeler par matlab:
1) j'ai tapé: mex -setup
2) il me propose d'utiliser un compilateur déjà installer j'ai dit "n" pour NON
3) il me propose une liste de compilateur dont le "Intel visual fortran 9.1", je choisi donc dans la liste le numéro qui convient pour prendre mon compilateur
4) Jusque là tous se passe correctement car il ne montre pas de message d'erreurs
5) je veux créer un fichier mex pour pouvoir utliser ma fonction (qui se trouve sur mon bureau) donc je tape: mex -v "D:\Documents and Settings\....\ACM552G.FOR" "D:\Documents and Settings\...\ACM552.FOR"
Est la j'ai un message d'erreur dont la conséquence directe est une non création de mon ficheir mex!
Voici l'erreur (qui apparait dans le bas du code ci dessous):
This is mex, Copyright 1984-2006 The MathWorks, Inc.
-> Default options filename found in D:\Documents and Settings\Bolivar\Application Data\MathWorks\MATLAB\R2007b
----------------------------------------------------------------
-> Options file = D:\Documents and Settings\Bolivar\Application Data\MathWorks\MATLAB\R2007b\mexopts.bat
MATLAB = D:\PROGRA~1\MATLAB\R2007b
-> COMPILER = ifort
-> Compiler flags:
COMPFLAGS = /fpp /Qprec "/ID:\PROGRA~1\MATLAB\R2007b/extern/include" -c -nologo -DMATLAB_MEX_FILE /fixed /fp:precise
OPTIMFLAGS = /MD -Ox -DNDEBUG
DEBUGFLAGS = /MD -Zi /PDB:"ACM552G.mexw32.pdb"
arguments =
Name switch = /Fo
-> Pre-linking commands =
-> LINKER = link
-> Link directives:
LINKFLAGS = /DLL /EXPORT:MEXFUNCTION /MAP /LIBPATH:"D:\PROGRA~1\MATLAB\R2007b\extern\lib\win32\microsoft" libmx.lib libmex.lib libmat.lib /implib:D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\templib.lib /NOLOGO
LINKDEBUGFLAGS = /debug /PDB:"ACM552G.mexw32.pdb"
LINKFLAGSPOST =
Name directive = "/out:ACM552G.mexw32"
File link directive =
Lib. link directive =
Rsp file indicator = @
-> Resource Compiler = rc /fo "mexversion.res"
-> Resource Linker =
----------------------------------------------------------------
--> "ifort /fpp /Qprec "/ID:\PROGRA~1\MATLAB\R2007b/extern/include" -c -nologo -DMATLAB_MEX_FILE /fixed /fp:precise /FoD:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\ACM552G.obj /MD -Ox -DNDEBUG -DMX_COMPAT_32 "D:\Documents and Settings\Bolivar\Bureau\test de Algo LNE HIchem Nouira\Tchebychef\disk 1\MZ_CON\ACM552G.FOR""
ifort: Command line warning: /fp:precise evaluates in source precision with Fortran.
--> "ifort /fpp /Qprec "/ID:\PROGRA~1\MATLAB\R2007b/extern/include" -c -nologo -DMATLAB_MEX_FILE /fixed /fp:precise /FoD:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\ACM552.obj /MD -Ox -DNDEBUG -DMX_COMPAT_32 "D:\Documents and Settings\Bolivar\Bureau\test de Algo LNE HIchem Nouira\Tchebychef\disk 1\MZ_CON\ACM552.FOR""
ifort: Command line warning: /fp:precise evaluates in source precision with Fortran.
Contents of D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\mex_tmp.rsp:
D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\ACM552G.obj D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\ACM552.obj
--> "link "/out:ACM552G.mexw32" /DLL /EXPORT:MEXFUNCTION /MAP /LIBPATH:"D:\PROGRA~1\MATLAB\R2007b\extern\lib\win32\microsoft" libmx.lib libmex.lib libmat.lib /implib:D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\templib.lib /NOLOGO @D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\mex_tmp.rsp "
LINK : error LNK2001: unresolved external symbol MEXFUNCTION
D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7F7156DA-AAE4-40C9-4E93-6C0B78A1C701\templib.lib : fatal error LNK1120: 1 unresolved externals
D:\PROGRA~1\MATLAB\R2007B\BIN\MEX.PL: Error: Link of 'ACM552G.mexw32' failed.
??? Error using ==> mex at 208
Unable to complete successfully.
Quelqu'un à -t-il une idée d'ou peu bien provenir cette erreur?? Comment puis je régler cela?? Merci pour vos réponses.
Appeler fonction écrite en fortran dans matlab
Re Bonjour,
J'ai essayé l'exemple avec la fonction yprime() qui est donné sur le site : http://www.mathworks.com/support/tec...1600/1605.html
Au début ça ne marchait pas et puis j'ai eu l'idée de regrouper les deux fichiers (fonction et gateway Routine) en un seule fichier yprimefg.f et là ça à fonctionné!
Le problème c'est qu'en faisant la même chose avec ma fonction (regroupement de ACM552.FOR et ACM552G.FOR en un seule fichier ACM552.FOR) ça à l'air d'être mieux qu'avant mais ça bloque maintenant sur des "fonctions" qui sont ds le programme fortran. Voici mes erreurs :
ifort: Command line warning: /fp:precise evaluates in source precision with Fortran.
Creating library D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7B2C97E7-C6E5-477A-2882-D6661C979241\templib.lib and object D:\DOCUME~1\Bolivar\LOCALS~1\Temp\mex_7B2C97E7-C6E5-477A-2882-D6661C979241\templib.exp
ACM552.obj : error LNK2019: unresolved external symbol _MEXERR referenced in function _MEXFUNCTION
ACM552.obj : error LNK2019: unresolved external symbol _GETSCA referenced in function _MEXFUNCTION
ACM552.obj : error LNK2019: unresolved external symbol _REALP referenced in function _MEXFUNCTION
ACM552.obj : error LNK2019: unresolved external symbol _CRTMAT referenced in function _MEXFUNCTION
ACM552.obj : error LNK2019: unresolved external symbol _ALREAL referenced in function _MEXFUNCTION
ACM552.obj : error LNK2019: unresolved external symbol _CPIN referenced in function _MEXFUNCTION
ACM552.mexw32 : fatal error LNK1120: 6 unresolved externals
D:\PROGRA~1\MATLAB\R2007B\BIN\MEX.PL: Error: Link of 'ACM552.mexw32' failed.
??? Error using ==> mex at 208
Unable to complete successfully.
Que puis je faire?? Je ne sais pas du tout d'où viennent ces erreurs car je ne connais malheureusement pas trop le fortran. Qui a une idée?? Merci pour vos réponses.
Appeler fonction écrite en fortran dans matlab
Bonjour,
Alors personne n'a une idée??
Le code dont je dispose est ancien (1992) et j'ai l'impression qu'il y a des appelles de fonction (comme MEXERR, GETSCA....) qui ne sont pas reconnu. Le problème est de savoir si c'est mon code source qui est incomplet ie les fonctions qui bloques n'existent pas dans les compilateurs fortran ou si c'est mon compilateur qui ne possède pas ces fonction car elle sont trop ancienne.
J'ai aussi essayé de compiler le fichier avec gfortran et j'ai obtenu les même erreurs.
Quelqu'un peut il me dire oui ou non si le problème vient d'un manque de code source pr les fonctions appelées ou alors de mon compilateur qui manque de package??