3

我正在尝试使用模块和过程来测试 Fortran/C 混合语言。我使用了此链接中的基本示例案例: http: //cftcc.iccas.ac.cn/upload/doc/ifc/f_ug1/pgwusmod.htm 但是当我尝试修改代码时,我开始收到类似的错误

"_initfo_", reference from: _MAIN__ in main.o
ld: symbol(s) not found for architecture x86_64. 

这是我的代码:

new.F >>
      MODULE EXAMP
      use iso_c_binding
         REAL, bind(C) :: A(3)
         INTEGER I1, I2
         CHARACTER(80) LINE
         TYPE MYDATA
             SEQUENCE
             INTEGER N
             CHARACTER(30) INFO
          END TYPE MYDATA
      END MODULE EXAMP
cnew.c >>
/* C  code accessing module data */
extern float a[3];
extern int examp_mp_i1, examp_mp_i2;
extern char examp_mp_line[80];
//extern void usemodule();
extern struct {
    int n;
    char info[30];
} examp_mp_mydata;

void pythagoras (float *c){
    *c = (float) sqrt(a[0]*a[0] + a[1]*a[1]);
}

void initfo(float *aa){
     *aa = a[0]+a[1]+a[2];
}
main.F >>
! Fortran 95/90 Module including procedure
      MODULE CPROC
        INTERFACE
            SUBROUTINE PYTHAGORAS ( res)
            !DEC$ ATTRIBUTES C :: PYTHAGORAS
            !DEC$ ATTRIBUTES REFERENCE :: res
! res is passed by REFERENCE because its individual attribute
!: overrides the subroutine's C attribute
            REAL res
! a and b have the VALUE attribute by default because
! the subroutine has the C attribute
            END SUBROUTINE
        END INTERFACE
        END MODULE

! Fortran 95/90 Module including procedure
      MODULE CCPROC
        INTERFACE
            SUBROUTINE INITFO (aa)
            REAL aa
            END SUBROUTINE
        END INTERFACE
        END MODULE

        PROGRAM MAIN
        USE EXAMP
! Fortran 95/90 Module including procedure
        USE CPROC
        USE CCPROC
        A(1)=1.0
        A(2)=2.0
        A(3)=3.0
        WRITE(*,*) A(1)
        CALL PYTHAGORAS ( X)
        WRITE(*,*) X

        CALL INITFO(Y)
        WRITE(*,*) Y
        END PROGRAM MAIN

我正在使用英特尔编译器。这就是我为编译所做的:

icc -c cnew.c
ifort -c new.f
ifort -o test main.f new.o cnew.o

我对fortran真的很陌生。我真的希望有人能指出我正确的方向。

谢谢,

4

1 回答 1

3

使用 Fortran 2003,您可以像这样声明接口:

  INTERFACE
      SUBROUTINE PYTHAGORAS (res) bind(c, name='pythagoras')
        use iso_c_binding
        real(kind=c_float) :: res
      END SUBROUTINE

      SUBROUTINE initfo (aa) bind(c, name='initfo')
        use iso_c_binding
        real(kind=c_float) :: aa
      END SUBROUTINE
  END INTERFACE

这里的要点是添加到子例程声明中的 name 属性,它告诉编译器实际使用哪个符号。否则,名称 mangling 会为您提供未找到的实体。

总的来说,这给出了:new.f90

MODULE EXAMP
  use iso_c_binding

  REAL(kind=c_float), bind(c) :: A(3)
  INTEGER :: I1, I2
  CHARACTER(80) :: LINE

  TYPE MYDATA
     SEQUENCE
     INTEGER :: N
     CHARACTER(len=30) :: INFO
  END TYPE MYDATA

END MODULE EXAMP

main.f90

MODULE CPROC
  use iso_c_binding
  INTERFACE
      SUBROUTINE PYTHAGORAS (res) bind(c, name='pythagoras')
        use iso_c_binding
        real(kind=c_float) :: res
      END SUBROUTINE

      SUBROUTINE initfo (aa) bind(c, name='initfo')
        use iso_c_binding
        real(kind=c_float) :: aa
      END SUBROUTINE
  END INTERFACE
END MODULE

PROGRAM MAIN
   USE EXAMP
! Fortran 95/90 Module including procedure
   USE CPROC

   A(1)=1.0
   A(2)=2.0
   A(3)=3.0
   WRITE(*,*) A(1)
   CALL PYTHAGORAS(X)
   WRITE(*,*) X

   CALL INITFO(Y)
   WRITE(*,*) Y
END PROGRAM MAIN

c代码不变。我会敦促您不要使用像您的a.

于 2015-09-26T07:23:49.610 回答