参考文献
cmain.c文档
#include"stdio.h" void foo (); int main () { foo (); return 0; }fmain.f文档
! fmain.f PROGRAM fmain external foo call foo() ENDfoo.c文档
#include <stdio.h> void foo() { printf ("hello world\n"); }foo.f文档
!foo.f SUBROUTINE foo() print *,"hello world" ENDmakefile文档
all:ccmain fcmain cfmain ffmain ccmain: gcc -c foo.c gcc -c cmain.c gcc -o ccmain cmain.o foo.o ./ccmain fcmain: gcc -c foo.c gcc -c fmain.f -ffree-form -fno-underscoring gcc -o fcmain fmain.o foo.o -lgfortran ./fcmain cfmain: gcc -fno-underscoring -ffree-form -c foo.f gcc -c cmain.c gcc -o cfmain cmain.o foo.o -lgfortran ./cfmain ffmain: gcc -fno-underscoring -ffree-form -c foo.f gcc -c fmain.f -ffree-form -fno-underscoring gcc -o ffmain cmain.o foo.o -lgfortran ./ffmain Analysis: nm foo.o nm cmain.o clean: rm -rf *.o ccmain cfmain fcmain ffmainU表示在main.o中符号foo是未定义的,需要从外部链接进来。T表示该符号存在于这个目标文件对应的文本文件中,说白了就是有定义的符号。
Non-numeric character in statement label报错加上-ffree-form即可
对"gfortran_set_args"未定义的引用,加上-lgfortran即可
对‘foo_’未定义的引用,-fno-underscoring取消下划线
编译器(f77)的一个命名规则,没有为什么,它就是把你在fortran中的函数名字全转换成小写,然后在最后加一个下划线。
对应的四种情况分别是
C语言主函数调用C语言子函数ccmainC语言主函数调用Fortran子函数cfmainFortran主函数调用C语言子函数fcmainFortrtan主函数调用Fortran子函数ffmain