Appel à une DLL dev. en C depuis du code Fortran
Bonjour,
Je souhaite en ce moment faire appel à une routine d'une DLL développée en C depuis un programme Fortran (Je sais le faire mais de Fortran à Fortran..). Et je rencontre le message suivant:
- sous Compaq Visual Studio:
Linking...
Creating library Debug/Xxxxx.lib and object Debug/Xxxxx.exp
xxx.obj : error LNK2001: unresolved external symbol _MAROUTINEENC@28
Debug/Xxxxx.dll : fatal error LNK1120: 1 unresolved externals
- sous Visual Studio 2005 (compiler Intel 10.1.024)
Erreur 1 error LNK2019: symbole externe non résolu _MAROUTINEENC référencé dans la fonction _FONCTIONAPPELANTE xxx.obj
Erreur 2 fatal error LNK1120: 1 externes non résolus Debug\Xxxxx.dll
Voici le morceau de code de la DLL en C appelé:
Code:
1 2 3 4 5 6 7 8 9 10 11
|
...
#define DLL_EXPORT __declspec(dllexport)
...
void DLL_EXPORT maroutineenC(int *arg0, char *arg1, char *arg2, char *arg3)
{
...
} |
Voici le code Fortran appelant:
Code:
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
|
...
interface
subroutine maroutineenC(arg0, arg1, arg2, arg3)
character*200,intent(in) :: arg1
character*20,intent(in) :: arg2
character*20,intent(in) :: arg3
integer*4,intent(out) :: arg0
!DEC$ ATTRIBUTES DLLEXPORT :: maroutineenC
!DEC$ ATTRIBUTES REFERENCE :: arg0, arg1, arg2, arg3
end subroutine
end interface
...
character*200,intent(in) :: arg1
character*20,intent(in) :: arg2
character*20,intent(in) :: arg3
integer*4,intent(out) :: arg0
arg1= 'Test.txt'//char(0)
arg2= 'BLABLA'//char(0)
arg2= 'Salut'//char(0)
call maroutineenC(arg0, arg1, arg2, arg3)
... |
Pour information:
- Les fichiers maDLLenC.dll et maDLLenC.lib sont bien attachés au projet.
- J'ai également testé en ajoutant la syntaxe "pointeur" dans la déclaration de l'interface dans le code Fortran:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
...
interface
subroutine maroutineenC(arg0, arg1, arg2, arg3)
character, pointeur, intent(in) :: arg1
character, pointeur, intent(in) :: arg2
character, pointeur, intent(in) :: arg3
integer*4, pointeur, intent(out) :: arg0
!DEC$ ATTRIBUTES DLLEXPORT :: maroutineenC
!DEC$ ATTRIBUTES REFERENCE :: arg0, arg1, arg2, arg3
end subroutine
end interface
... |
mais sans changements...
Auriez-vous des idées SVP ?
Cordialement,