[PLUTO-devel] linkink eterogeneo fortran-C++
Gregorio D'Agostino
dagostin a casaccia.enea.it
Gio 30 Ott 2003 17:47:28 CET
Scusate se torno sul problema g77 / g++.
Grazie ai suggerimenti di Andrea sono riuscito in parte nel mio problema
> Per far "vedere" le routines C++ agli OBJ del
> fortran bisogna agganciare una "extrn C" a tutte le
> funzioni da fargli vedere.
>
> .... le tue dichiarazioni Fortran nei moduli C++
> saranno tipo:
>
> extrn static void/Int/quellochetepare MiaFunzione;
>
> Mentre le tue dichiarazioni C++ da esportare nel
> file OBJ saranno tipo:
>
> extrn C {
> static void MiaFunzioneCpp;
> }
>
>......................
In realta nella forma esatta in cui sono stati scritti non funzionano. Pero'
sono riuscito a vedere le C++ dal fortran nel seguente esempio:
Fortran:
program main
implicit none
real*8 a
external twice
a=3
write(6,*)'Fortan test'
write(6,*)a
call twice(a)
write(6,*)a
end
---------------------------------------------------------
C++:
#include<stdlib.h>
#include<stdio.h>
#include<stl.h>
extern "C" {
extern void twice_(double *a)
{
*a *= 2;
} ;
}
---------------------------------------------------------
Questa coppia funziona regolarmente.
Quando cerco invece di fare l'opposto con la coppia
C++(test_cpp.cpp):
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#include<stl.h>
int main()
{
extern static void twice_(double *);
static double a;
cin >> a ;
cout << a << endl ;
twice_(&a) ;
cout << a << endl ;
}
---------------------------------------------------------
Fortran:
subroutine twice(a)
implicit none
real*8 a
a=a*2
write(6,*)'in twicef a=',a
return
end
--------------------------------------------------------
g++ -c test_cpp.cpp
mi dà errore:
test_cpp.cpp: In function `int main()':
test_cpp.cpp:8: multiple storage classes in declaration of `twice_'
test_cpp.cpp:8: cannot declare static function inside another function
Se invece levo lo static
ottengo errore di link:
g++ test_cpp.o twice_f.o -lg2c
fornisce:
test_cpp.o: In function `main':
test_cpp.o(.text+0x53): undefined reference to `twice_(double *)'
collect2: ld returned 1 exit status
-------------------------------------------------------------------------------
Come fare?
Grazie ancora a chi volesse rispondere
Cordialmente
Gregorio
Maggiori informazioni sulla lista
pluto-devel