2010-02-17 8 views
1

J'ai un problème à l'aide d'un dll fortran dans MATLAB. Je ne pouvais pas utiliser une DLL, qui est construite par fortran, dans matlab. J'utilise l'instruction "loadlibrary" dans matlab mais l'erreur est liée aux fichiers d'en-tête. Qu'est-ce qu'un fichier d'en-tête ?? s'il vous plaît donnez-moi plus d'informations pour charger un dll fortran dans matlab et appelez-le.en utilisant dll dans matlab

Répondre

4

Plutôt que d'essayer d'utiliser un fichier dll directement, je vous suggère de le reconstruire en utilisant la fonctionnalité MEX de Matlab. Oui, un fichier mex est un dll et vous pouvez créer des dlls en dehors de Matlab et les utiliser avec succès, c'est beaucoup plus facile, pour un débutant comme je suppose que vous l'êtes, d'utiliser MEX. Une façon de simplifier est que, si vous construisez un fichier mex, le système ne vous demandera pas un fichier d'en-tête qui est, comme vous le savez, un concept plutôt étranger à un programmeur Fortran. Une autre façon dont MEX vous facilitera la vie est que vous pouvez ensuite appeler la fonction exposée par la DLL directement depuis la ligne de commande de Matlab, sans loadlibrary.

Etudiez la documentation Matlab sur les fichiers MEX, en portant une attention particulière à l'intégration de Fortran de cette manière.

1

Vous devez fournir un fichier d'en-tête qui définit chacune des fonctions nommées dans la DLL Fortran que vous appelez. Par exemple, si votre DLL contient une fonction nommée sum qui résume deux doubles variables de précision, comme:

function sum(a,b) result(sum) 
    real(kind=2), intent(in) :: a, b 
    real(kind=2) :: sum 
    sum = a + b 
end function 

Ensuite, votre tête devra contenir quelque chose comme:

double sum(double*a, double*b); 

Mais ne pas oublier de Décorez ceci avec le nom mangling spécifique à votre compilateur Fortran. Par exemple, si sum était dans un module nommé foo, et compilé avec le gfortran, alors vous aurez besoin de quelque chose comme:

double __foo_MOD_sum(double*a, double*b); 

Il y a beaucoup d'autres cas, mais c'est l'essentiel.