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é:
Voici le code Fortran appelant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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) { ... }
Pour information:
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 ... 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) ...
- 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:
mais sans changements...
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 ... 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 ...
Auriez-vous des idées SVP ?
Cordialement,
Partager