从C调用模块中的子例程

从C调用模块中的子例程,c,module,fortran,C,Module,Fortran,我想知道如何让C程序调用包含Fortran 90模块的Fortran 90子程序 ,我正在尝试实施解决方案,但仍然存在问题 下面是包含主函数的testC.c文件和包含Fortran 90子例程的模块文件testF.f90的示例 testC.c #include <stdlib.h> #include <stdio.h> extern void __testF_MOD_fortfunc(int *,float *); int main() { int ii=5;

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

,我正在尝试实施解决方案,但仍然存在问题

下面是包含主函数的
testC.c
文件和包含Fortran 90子例程的模块文件
testF.f90
的示例

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;
}
为了编译,我使用以下几行代码

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

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

0000000000000000 g     F .text  00000000000000b4 __testf_MOD_fortfunc
这是你的函数名。您可以看到它是小写的
testf
。 在C代码中使用这个应该可以解决您的问题


但是,这些命名约定依赖于编译器。您应该仔细研究一下
ISO_C_绑定
模块以及现代Fortran中改进的C互操作性

我已经更新了我的问题,使之更加具体。也就是说,它在编译时失败,并表示“未定义对_testF_MOD_fortfunc的引用文件的列出顺序对链接器很重要。它可能会解决您在link命令中交换testC.o和testF.o的问题。尝试交换testC.o和testF.o。不幸的是没有运气。仅供参考:您不需要将函数声明指定为“extern”“.AFAIK它仅可用于变量。请使用通用标记。否则,您指的是超过25年的特定标准(提示:最新发布的标准是Fortran 2008,Fortran 2015正在开发中)。作为一个额外的好处,更多的用户使用通用标签。
0000000000000000 g     F .text  00000000000000b4 __testf_MOD_fortfunc