我必须在从C / C ++调用FORTRAN子例程时做一个概念验证。 我不知道自己的方向是正确的,请指导我......
我做的是......
我写了以下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 c
c = SQRT (a * a + b * b)
END
使用g77将其编译为g77.exe -c FORTRANfun.for
我写了以下c代码......
#include <stdio.h>
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
答案 0 :(得分:5)
大部分时间都是符号情况。
f77 comiler标志“-fno-underscore”和“-fno-second-underscore”将改变目标代码中的默认命名,从而影响链接。可以使用命令nm(即:nm file.o)查看目标文件。
注意:不保留FORTRAN中的大小写,并在目标文件中以小写形式表示。 g77编译器选项“-fsource-case-lower”是默认值。 GNU g77 FORTRAN可以使用编译选项“-fsource-case-preserve”区分大小写。
参考THIS
答案 1 :(得分:2)
在Zeeshan answer之上,你必须使用指针将变量传递给Fortran:
extern int __stdcall fact(int* n);
extern void __stdcall pythagoras(float* a, float* b, float *c);