【发布时间】:2018-12-02 23:27:20
【问题描述】:
我正在尝试修改 this code (gist as back up) 以使其与 gfortran-gcc 兼容。
- 我删除了
[VALUE]标签 - 将
POINTER与-fcray-pointer标志一起用于gfortran,而不是[REFERENCE]标记 - 删除了
__stdcall,因为尝试了导致warning: ‘stdcall’ attribute ignored [-Wattributes]的#define __stdcall __attribute__((stdcall))现在这就是我所拥有的:
C码CMAIN.C:
#include <stdio.h>
extern int FACT_(int n);
extern void 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);
}
FORTRAN 代码FORSUBS.FOR:
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, cp)
REAL*4 a
REAL*4 b
POINTER (cp, c)
REAL*4 c
c = SQRT (a * a + b * b)
END
Makefile:
all:
gfortran -c FORSUBS.FOR -fcray-pointer
gcc -c CMAIN.C
gfortran -o result.out FORSUBS.o CMAIN.o
rm -rf *.o
clean :
rm -rf *.out *~ *.bak *.o
但我仍然收到错误:
CMAIN.o:在函数“main”中:
CMAIN.C:(.text+0x1d): 对 `FACT_(int)' 的未定义引用
CMAIN.C:(.text+0x4c): 未定义引用 `PYTHAGORAS_(float, float, float*)'
如果您能帮助我了解,我将不胜感激:
- 是什么问题,我该如何解决?
- 修改原始代码以使 gcc-gfortran 与最小更改兼容的最佳方法是什么。
P.S.1. 也在Reddit 上分享。 P.S.2.操作系统和编译器规格与this question相同。
【问题讨论】:
-
当我编译你的
fortran,并在.o上使用nm时,我得到的符号是:fact_和pythagoras_与你在@987654344 中声明的符号@ 文件(即它们是 小写 与您在.c文件中使用的 大写 大小写) -
名称修饰是编译器特定的。这就是我们在本世纪拥有fortran-iso-c-binding 的原因。这里有很多类似的问题。
-
通过引用传递,因为我至少写了两次。只需删除不需要的
[REFERENCE]。您应该更担心按值传递。 -
@Foad,很明显,您对 Fortran 的了解仍然非常原始,因为该语言的名称是 Fortran。 Fortran 已经有 3 年左右的时间了。
-
您必须从您的
all:目标中删除rm -rf *.o才能保留您的.o文件。执行nm FORSUBS.o CMAIN.o将输出每个.o的符号表。FORSUBS.o将具有T[文本] 符号,CMAIN.o将显示U类型符号。这些应该匹配。
标签: c fortran mixed-programming