Salut,
Je suis complètement novice en Fortran. En fait, c'est pire que cela car je code depuis longtemps uniquement en Python. Donc je n'ai aucune notion correcte de pointer, d'espace mémoire, de compilation...
Pour un besoin professionnel je souhaite recompiler un code Fortran (f90) pour en faire une DLL. Ce code avait été compilé il y a plusieurs années par un collègue qui ne bosse plus dans mon département et pour un architecture 32bits. Cette DLL est ensuite utilisée par un programme commercial. Voilà pour la petite histoire.
J'ai commencé par faire une compilation à la sauvage sans trop regarder comment ça marche. Et bien entendu le résultat n'est pas fonctionel. Le programme commercial en question n'est pas bavard, mais il semble indiquer qu'il ne trouve pas la routine voulue dans la DLL que j'ai compilée. Je me suis donc dis que je devrais repartir d'un exemple plus simple, dont l'architecture se rapproche du code final.
Je sèche sur le problème suivant : compiler un code Fortran contenant une seule fonction (ou routine, au choix) en une DLL puis appeller cette fonction par un autre code. Voilà ce que j'ai fait :
Le code Fortran add.f90 (avec le décorateur, car j'ai l'impression que c'est ça qui permet d'accéder ensuite à la fonction depuis l'extérieur)
1 2 3 4 5 6 7
|
function add(x, y)
!DEC$ ATTRIBUTES DLLEXPORT :: add
real :: add
real, intent(in) :: x, y
add = x + y
end function add |
La compilation:
1 2
| gfortan -c add.f90
gfortran -shared -o add.so add.o |
Le code externe appelant la DLL:
1 2 3 4
| import ctypes
libc = ctypes.CDLL('add.so')
print(libc.add(1.2, 3)) |
Oui, je fais des tests sur mon PC perso sous linux, d'où l'extension .so. Mon PC de travail est sous Windows 7 et j'utiliserais gfortan également, fourni par mingw (dernière version en date). Le code appelant la library est du Python. Le message d'erreur renvoyé par son exécution est :
AttributeError: add.so: undefined symbol: add
Là encore j'ai l'impression que la fonction add n'est pas trouvée. Je ne comprends pas comment faire l'export proprement. Est-ce lié au compilateur ?
J
Partager