我想知道如何让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
答案 0 :(得分:3)
您可以使用objdump -t testF.o
直接从对象中读出函数名称。这揭示了以下几行:
0000000000000000 g F .text 00000000000000b4 __testf_MOD_fortfunc
这是你的功能名称。您可以看到它是testf
小写的。
在C代码中使用它可以解决您的问题。
但是,这些命名约定依赖于编译器。您应该真正了解ISO_C_binding
模块以及现代Fortran的改进C互操作性。