Windows下用MinGW gfortran编译Digital Datcom源码报错求助
问题根因
你拿到的DATCOM是早年的FORTRAN 77遗留代码,大量使用了旧版Fortran编译器支持的非标准语法扩展,现代gfortran默认开启标准语法检查,因此会抛出大量不兼容报错,不是你操作步骤有遗漏。
各报错排查解决方法
报错1:Rank mismatch in argument ‘mess’
INTERX子程序要求MESS参数为长度20的一维数组,调用时传入的是4HRE标量霍勒瑞斯常量,旧编译器允许将标量直接作为数组首元素传入,gfortran默认禁止该操作。
解决方法:编译时添加-fno-argument-mismatch参数关闭实参与形参不匹配的严格检查,无需修改源码。
报错2:Type mismatch in argument ‘x2’
该报错由老代码的隐式类型约定、逻辑值与数值混用的非标准写法导致,旧编译器默认允许逻辑值直接作为实型/整型参数传递,gfortran默认禁止该操作。
解决方法:编译时添加-fallow-invalid-boz -fno-range-check参数兼容该类非标准写法,如果仍然报错可定位到对应子程序,给x2变量补充对应类型的显式声明即可。
报错3:Actual argument contains too few elements for dummy argument ‘kol’
RVALUE子程序要求KOL参数为长度80的数组,调用时传入的KOL数组长度不足,旧编译器不校验数组传入长度,gfortran默认开启校验。
解决方法:和报错1共用-fno-argument-mismatch参数即可绕过检查,无需修改源码。
MinGW gfortran适配编译方案
直接使用以下编译命令即可完成编译:
gfortran -std=legacy -fno-argument-mismatch -fallow-invalid-boz -fno-range-check -w datcom.f -o datcom.exe
参数说明:
-std=legacy:开启FORTRAN 77遗留语法兼容模式-w:关闭所有警告信息,避免老代码的大量无意义警告刷屏
如果编译完成后运行时提示缺少动态库,将MinGW安装目录下bin文件夹中的libgfortran-*.dll、libgcc_s_*.dll、libwinpthread-*.dll拷贝到datcom.exe同级目录即可正常运行。
内容的提问来源于stack exchange,提问作者ASD

