编译使用hplots的Fortran绘图代码报错求助(附USGS仓库代码)
解决Fortran绘图代码(vangodshJ.f)的编译报错问题
我经常处理Fortran编译相关的问题,针对你提到的这款USGS有限断层仓库里的绘图代码vangodshJ.f,在ifort或gfortran下编译报错的情况,咱们一步步来排查解决:
一、先检查编译命令的基础配置
很多报错都是因为编译参数没匹配代码需求:
- 固定格式文件兼容:因为
.f是Fortran固定格式文件,现代编译器默认可能用自由格式解析,会直接报错。- 用gfortran的话,加上这两个参数:
gfortran -ffixed-form -ffree-line-length-none vangodshJ.f -o vangodsh - 用ifort的话,对应参数是:
ifort -fixed -extend-source vangodshJ.f -o vangodsh
- 用gfortran的话,加上这两个参数:
- 链接绘图依赖库:这款绘图代码大概率依赖第三方绘图库(比如DISLIN、PGPLOT这类常用的Fortran绘图工具),如果没链接库会报未定义引用错误。比如依赖DISLIN的话,编译命令要加上链接参数:
- gfortran:
gfortran -ffixed-form -ffree-line-length-none vangodshJ.f -o vangodsh -ldislin - ifort:
ifort -fixed -extend-source vangodshJ.f -o vangodsh -ldislin
如果库不在系统默认路径,还要加上-L/你的库安装路径/lib和-I/你的库安装路径/include来指定位置。
- gfortran:
二、排查代码本身的语法兼容性问题
老Fortran代码(尤其是Fortran 77风格的)容易和现代编译器的默认规则冲突:
- 列格式错误:固定格式要求代码写在第7-72列,注释在第1列(用
C或*标记),续行要在第6列加非空格字符(比如&或数字)。如果代码里有行内容超出72列,或者续行标记位置不对,编译器会直接报错。可以打开代码检查这类格式问题。 - 隐式类型导致的错误:老代码常依赖隐式类型规则(I-N开头的变量默认是整数,其他默认是实数),但现代编译器可能默认开启严格检查,导致类型不匹配报错。你可以:
- 在代码开头添加
IMPLICIT NONE强制声明所有变量,这样能快速找出未声明或类型错误的变量(需要修改代码); - 或者用编译器参数放宽检查:gfortran加
-fno-implicit-none,ifort加-no-warn implicit。
- 在代码开头添加
- 编译器特定语法:ifort和gfortran对某些非标准扩展的支持不一样,比如某些内部函数、模块引用。如果报错指向某条特定语句,先查这条语句是不是某款编译器的专属语法,替换成标准Fortran语法即可。
三、利用报错信息精准定位
如果上面的通用方法没解决,把编译器输出的具体报错内容(比如错误行号、错误描述)贴出来,就能更快锁定问题——比如是某行变量未声明、某个库函数找不到,还是语法格式错误,针对性解决就行。
内容的提问来源于stack exchange,提问作者David Naranjo Hernandez
相关产品推荐
相关产品推荐

