[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