Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Edition de lien FORTRAN - C

3 réponses
Avatar
eli
Bonjour =E0 Tous,

J'ai un probl=E8me d'=E9dition de lien d'une application m=EAlant
les fichiers c et fortran, les fichiers c appelant des fonctions
d=E9finies dans les fichiers fortran.

Celle-ci a d=E9j=E0 =E9t=E9 compil=E9e avec le compilateur gcc, et les
instructions suivantes :

Pour les fichiers c :
gcc -g -D_POSIX_SOURCE -D_POSIX_C_SOURCE

Pour les fichiers fortran :
gcc -x f77 -g -fno-second-underscore

Elle doit maintenant =EAtre compil=E9e avec les compilateurs cc pour les
fichiers c et f77 ou f90 pour les fichiers fortran
J'ai tent=E9 l'extension -ext-names=3Dplain sans r=E9sultat


Cette application comporte :
Dans les fichiers include, un fichier bbt.h dans lequel il
est =E9crit qu'il s'agit d'un header d'interface C/Fortran. Il
comporte des d=E9clarations du type :
#define xdjc(jc) xdjc_(&j,c,8L) ; c[8]=3D'0'

dans les fichiers source, un fichier libbt.f comporte des
instructions du type :
subroutine XDJC(DJ,DC) ...

dans les fichiers source, un fichier c fait des appels du
type :
xdjc(d1, d2)


Les fichiers sont compil=E9s mais l'=E9dition de lien ne se fait pas et
j'obtiens le message d'erreur suivant :

xdjc_ symbole non d=E9fini


Or je sais qu'ils sont d=E9fini puisque cette application compile avec
gcc.

Quelqu'un saurait-il ce que je dois modifier ?

Merci beaucoup

3 réponses

Avatar
Etienne de Tocqueville
"eli" a écrit sur fr.comp.lang.c :

est écrit qu'il s'agit d'un header d'interface C/Fortran. Il
comporte des déclarations du type :
#define xdjc(jc) xdjc_(&j,c,8L) ; c[8]='0'


Je suppose qu'il fallait lire :

#define xdjc(j,c) xdjc_(&j,c,8L) ; c[8]='0'

Visiblement, le 2ème argument est un argument de sortie qui est une
chaîne de caractère qui fait toujours exactement 8 caractères.

Les fichiers sont compilés mais l'édition de lien ne se fait pas et
j'obtiens le message d'erreur suivant :

xdjc_ symbole non défini


De toute évidence, le compilateur fortran n'a pas rajouté un "_" à la
fin. Pour savoir comment il a réécrit le nom du symbole, le plus simple
est de faire un "nm libbt.o" et de voir comment le nom a été réécrit. Il
suffit alors d'utiliser ce nom tel quel dans la partie en langage C.

Avatar
eli
Bonjour,


Merci pour cette réponse.
Elle ne marche pas, mais déplace le probème. Les symboles n'ont
définis sont désormais __s_cmp, __i_dnnt, __aint, ctoi, gtim, itoc,
idate. Toutes les librairies utilisées ne peuvent recompilées car
nous n'avons pas toutes les sources.
J'ai contourné le problème en effectuant l'édition de lien avec f77
et là ça marche.
Mais si tu as une idée pour faire l'édition de lien avec cc, je suis
preneuse. Il est toujours bon à apprendre.




"eli" a écrit sur fr.comp.lang.c :

est écrit qu'il s'agit d'un header d'interface C/Fortran. Il
comporte des déclarations du type :
#define xdjc(jc) xdjc_(&j,c,8L) ; c[8]='0'


Je suppose qu'il fallait lire :

#define xdjc(j,c) xdjc_(&j,c,8L) ; c[8]='0'

Visiblement, le 2ème argument est un argument de sortie qui est une
chaîne de caractère qui fait toujours exactement 8 caractères.

Les fichiers sont compilés mais l'édition de lien ne se fait pas et
j'obtiens le message d'erreur suivant :

xdjc_ symbole non défini


De toute évidence, le compilateur fortran n'a pas rajouté un "_" à la
fin. Pour savoir comment il a réécrit le nom du symbole, le plus simp le
est de faire un "nm libbt.o" et de voir comment le nom a été rééc rit. Il
suffit alors d'utiliser ce nom tel quel dans la partie en langage C.



Avatar
Etienne de Tocqueville
"eli" a écrit sur fr.comp.lang.c :

Elle ne marche pas, mais déplace le probème. Les symboles n'ont
définis sont désormais __s_cmp, __i_dnnt, __aint, ctoi, gtim, itoc,
idate.


Donc si, ça a marché, le linker a trouvé xdjc.

Mais après, il faut rajouter d'autres librairies pour définir les
fonctions appelées par xdjc.

Toutes les librairies utilisées ne peuvent recompilées car
nous n'avons pas toutes les sources.
J'ai contourné le problème en effectuant l'édition de lien avec f77
et là ça marche.


C'est parce que les fonctions manquantes (__s_cmp...) sont dans une ou
des librairies qui sont rajoutées automatiquement par le compilateur
fortran lorsqu'il appel le linker.

Ca veut donc dire qu'il est possible d'appeler directement le linker (ou
par l'intermédiaire de cc), mais qu'il faut trouver les librairies
qui contiennent les symboles manquants.

Mais si tu as une idée pour faire l'édition de lien avec cc, je suis
preneuse. Il est toujours bon à apprendre.


C'est possible, mais sans savoir de quel OS il s'agit, difficile de
répondre ! ;-)

Sur une station Sun Solaris, le fait de rajouter "-lm -lM77 -lF77
-lsunmath" devrait être suffisant pour simuler l'appel fait par
f77. Peut-être même qu'il faudrait rajouter -lU77, voir -lI77.