1

我必须对从 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
4

2 回答 2

4

这是由于大多数情况下的符号大小写。

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

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

参考这个

于 2014-05-15T04:57:20.757 回答
2

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

extern int __stdcall fact(int* n);
extern void __stdcall pythagoras(float* a, float* b, float *c);
于 2014-05-15T08:14:09.293 回答