从C调用模块中的子例程

时间:2016-02-17 19:38:48

标签: c module fortran

我想知道如何让C程序调用Fortran 90模块中包含的Fortran 90子程序。

This question deals with a similar problem,我试图实施解决方案,但我仍然遇到问题。

以下是testC.c文件的玩具示例,其中包含main函数,以及模块文件testF.f90,其中包含Fortran 90子例程。

testC.c

#include <stdlib.h>
#include <stdio.h>

extern void __testF_MOD_fortfunc(int *,float *);

int main() {
   int ii=5;
   float ff=5.5;

   __testF_MOD_fortfunc(&ii, &ff);

   return 0;
}

testF.f90

module testF

contains

subroutine fortfunc(ii,ff)
    implicit none

    integer ii
    real*4  ff

    write(6,100) ii, ff
    100 format('ii=',i2,' ff=',f6.3)

    return
end subroutine fortfunc

end module testF

要编译,我使用以下行

gcc -c testC.c
gfortran -o testF.f90
gcc -o test testF.o testC.o -lgfortran

我收到错误消息

testC.o: In function `main':
testC.c:(.text+0x27): undefined reference to `__testF_MOD_fortfunc'
collect2: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分:3)

您可以使用objdump -t testF.o直接从对象中读出函数名称。这揭示了以下几行:

0000000000000000 g     F .text  00000000000000b4 __testf_MOD_fortfunc

这是你的功能名称。您可以看到它是testf小写的。 在C代码中使用它可以解决您的问题。

但是,这些命名约定依赖于编译器。您应该真正了解ISO_C_binding模块以及现代Fortran的改进C互操作性。