编译Fortran多文件代码时报错Not defined as function or array怎么办
问题原因
该错误是编译test.f时编译器无法识别func的符号属性导致的,核心诱因有两点:
- 外部函数标识缺失:仅声明
REAL :: FUNC无法让Fortran编译器区分该符号是数组还是外部函数,部分编译器要求显式用EXTERNAL关键字标记外部调用的函数。 - 隐式声明+大小写匹配问题:你提供的func.f没有显式声明函数返回值、入参的类型,完全依赖Fortran默认的I-N隐式类型规则;同时部分ifort版本对固定格式.f文件默认开启大小写敏感,test.f中声明的大写
FUNC和func.f中定义的小写func会被判定为两个不相关的符号,无法匹配到定义。
解决方法
按以下步骤调整代码即可:
- 调整func.f,显式声明函数返回值和入参类型,规避隐式类型规则的不确定性:
REAL FUNCTION func(X) REAL :: X func = X RETURN END
- 调整test.f,添加EXTERNAL关键字标记func为外部函数,同时统一函数名大小写,额外可以修正你原本写反的输出变量(原代码输出X而非计算得到的Y):
PROGRAM test REAL :: X,Y REAL :: func EXTERNAL func X = 1.0 Y = func(X) WRITE(6,*) Y END
- 重新执行原有编译命令即可:
ifort -c func.f ifort test.f func.o -o test
如果调整后仍报相同错误,可添加-noforcasec编译参数关闭ifort的大小写敏感选项:
ifort -c -noforcasec func.f ifort -noforcasec test.f func.o -o test
内容的提问来源于stack exchange,提问作者Daniel Young
相关产品推荐
相关产品推荐

