macOS12 Intel平台gfortran编译旧Fortran报_main未定义错误
问题根因
_main符号缺失的链接错误,和Fortran固定格式语法本身无关——不存在固定格式Fortran可以省略主程序声明的规则,你之前的推测不成立。
Fortran 77标准中,没有被SUBROUTINE、FUNCTION、BLOCK DATA包裹的代码块会被识别为主程序,但gfortran对固定格式源码(.f后缀默认启用)默认执行严格的列位置校验:固定格式语法要求所有可执行语句、声明语句必须从第7列之后开始书写,前6列仅允许放置行号、注释标记、续行标记或留空。
你提供的源码存在两个典型的格式问题,导致gfortran完全没有识别到文件中的主程序块,最终链接时找不到程序入口:
- 主程序开头的
COMMON块、DIMENSION声明、输入输出语句缩进不符合列规则,要么是原始文件用tab缩进破坏了列位置,要么是复制过程中丢失了前6列的占位空格 - 存在无标记的断行字符串(
cappaR=的输出语句被拆成了两行,第二行没有加续行标记),导致语法解析中断
修复方案
方案1:手动修正源码格式(兼容性最好)
按照固定格式规则调整源码排版:
- 所有注释行以
c开头放在第一列即可,不用调整 - 所有声明、可执行语句前统一补充6个半角空格,保证语句起始位置在第7列
- 行号单独放在前6列区域,不要和后续语句挤在同一列位置
- 把无标记断行的字符串合并为单行,或在断行的下一行第6列位置添加任意非空格字符作为续行标记(常用
&或*)
修正后的主程序头部示例如下:
c program: nuclcarfilm1:it assumes nucleation and growth of an adsorbed film of monomers, c whose initial value is given by theta0; c X1=initial time in s (it cannot be exactly equal to zero!; if it is zero, set X1=0.0001); c X2=final time; NSTEP=number of steps between X1 ed X2 (for a good accuracy, c NSTEP should not be <100); c the number of molecules composing a nucleus is always set equal to 1 c Er=reversal transmembrane potential in V c E= potenziale transmembrana misurato rispetto a un resting potential infinitamente negativo, in V c z=charge number della gating charge q=ze, con e carica del protone COMMON /PATH/ XX(10000),Y(10,10000),DYDX(10,10000) DIMENSION VSTART(5),V(5),DV(5),XX(10000),Y(10,10000),DYDX(10,10000) COMMON/VALORI/S0,cappaN,cappaR,p write(*,*) 'BL2CaK.f' write(*,*) 'X2,E,Er,z,a,S0,cappaN,cappaR,smorz,cost' read(*,*) X2,E,Er,z,a,S0,cappaN,cappaR,smorz,cost write(*,*)'X2=',X2,'E=',E,'Er=',Er,'z=',z,'a=',a,'S0=',S0 write(*,*)'cappaN=',cappaN,'cappaR=',cappaR,'smorz=',smorz,'cost=',cost X1=0.00000 NSTEP=20000 Kount=0
注意DERIVS子程序中也存在注释断行挤占代码列的问题,把错位的rs=Y(1)语句前补充6个空格即可。
格式修正完成后,用如下命令编译即可:
gfortran -std=legacy -o test BL2CaK.f
方案2:启用宽松编译参数(无需手动改源码)
如果不想逐行调整格式,可以直接给gfortran传参关闭严格的固定格式校验,自动适配旧代码的缩进、tab、行长度问题:
gfortran -std=legacy -ffixed-line-length-none -ftab=6 -fno-automatic -o test BL2CaK.f
参数说明:
-std=legacy:兼容所有旧版Fortran非标准语法,包括隐式变量声明、老旧的PAUSE语句、无显式PROGRAM声明的主程序写法-ffixed-line-length-none:取消固定格式默认每行72字符的长度限制,避免长语句被截断-ftab=6:将源码中的tab字符识别为前6列的缩进占位,适配原始文件用tab排版的情况
运行说明
编译生成的test可执行文件直接运行即可,程序启动后会提示输入X2,E,Er,z,a,S0,cappaN,cappaR,smorz,cost共10个参数,按顺序输入回车即可开始计算。源码中用到的PAUSE语句在新版gfortran中会自动适配为执行到对应位置时暂停,等待用户按回车继续,不需要额外修改。
内容的提问来源于stack exchange,提问作者kos
相关产品推荐
相关产品推荐

