混合编程:从C调用FORTRAN

我必须从C / C ++中调用FORTRAN子例程进行概念validation。 我不知道我的方向是什么,请指导我….

我做的是……

我写了以下FORTRAN代码

INTEGER*4 FUNCTION Fact (n) INTEGER*4 n INTEGER*4 i, amt amt = 1 DO i = 1, n amt = amt * i END DO Fact = amt END SUBROUTINE Pythagoras (a, b, c) REAL*4 a REAL*4 b REAL*4 cc = SQRT (a * a + b * b) END 

使用g77将其编译为g77.exe -c FORTRANfun.for

我写了以下c代码……

 #include  extern int __stdcall FACT (int n); extern void __stdcall PYTHAGORAS (float a, float b, float *c); main() { float c; printf("Factorial of 7 is: %d\n", FACT(7)); PYTHAGORAS (30, 40, &c); printf("Hypotenuse if sides 30, 40 is: %f\n", c); } 

使用Visual Studio C编译器将其编译为cl /c new.c

当我尝试链接时,如LINK new.obj FORTRANfun.o我收到以下错误…

 new.obj : error LNK2019: unresolved external symbol _FACT@4 referenced in function _main new.obj : error LNK2019: unresolved external symbol _PYTHAGORAS@12 referenced in function _main new.exe : fatal error LNK1120: 2 unresolved externals 

在Zeeshan的回答之上,您必须使用指针将变量传递给Fortran:

 extern int __stdcall fact(int* n); extern void __stdcall pythagoras(float* a, float* b, float *c); 

大部分时间都是由于符号情况。

f77编译器标记“-fno-underscore”和“-fno-second-underscore”将改变目标代码中的默认命名,从而影响链接。 可以使用命令nm(即:nm file.o)查看目标文件。

注意:FORTRAN中的大小写未保留,并在目标文件中以小写forms表示。 g77编译器选项“-fsource-case-lower”是默认值。 GNU g77 FORTRAN可以使用编译选项“-fsource-case-preserve”区分大小写。

请参考这个