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 : 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)
{
   ...
}
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
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 : 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
 
       ...
mais sans changements...

Auriez-vous des idées SVP ?

Cordialement,