Fortran程序调用模块报错:派生类型linreg未定义求助
解决Fortran模块派生类型未定义编译错误
问题描述
编译调用外部模块的Fortran程序时,持续出现如下错误:
testinc.f95:5:17: 5 | type(linreg) :: lr | 1 Error: Derived type ‘linreg’ at (1) is being used before it is defined
模块文件linalg.f95代码:
module linalg implicit none type linreg integer :: n double precision :: m double precision :: b double precision :: Sxx double precision :: Sxy double precision :: Se double precision :: Syy double precision :: Sm double precision :: Sb double precision :: r end type end module
主程序testinc.f95代码:
program testinc use linalg implicit none type(linreg) :: lr print *,'done' end program
编译命令:
gfortran -fcheck=all -o testinc.exe linalg.f95 testinc.f95
环境为Ubuntu 22.04.03 + gfortran编译器,此前该模块可正常使用,当前编译失败。
解决方案
1. 清理旧编译产物后重新编译
旧的.mod模块文件或.o目标文件可能损坏、与当前代码不匹配,导致编译器无法正确识别模块内容。执行以下命令清理并重新编译:
# 删除所有.mod和.o文件 rm -f *.mod *.o # 重新编译 gfortran -fcheck=all -o testinc.exe linalg.f95 testinc.f95
2. 规范模块中派生类型的结束语句
虽然Fortran标准允许省略派生类型名的end type语句,但部分编译器在严格模式下可能出现识别问题。修改linalg.f95的派生类型结束语句,显式指定类型名:
module linalg implicit none type linreg integer :: n double precision :: m double precision :: b double precision :: Sxx double precision :: Sxy double precision :: Se double precision :: Syy double precision :: Sm double precision :: Sb double precision :: r end type linreg ! 显式指定类型名 end module
3. 确认文件名与模块名的大小写匹配
Ubuntu系统是大小写敏感的,确保模块文件名(linalg.f95)与代码中use语句的模块名(linalg)完全一致,避免出现诸如Linalg.f95与use linalg的不匹配情况。
4. 分步编译验证
如果上述方法无效,可分步编译模块和主程序,排查具体环节的问题:
# 先编译模块,生成.mod和.o文件 gfortran -c linalg.f95 # 再编译主程序,链接模块目标文件 gfortran -fcheck=all -o testinc.exe linalg.o testinc.f95
内容的提问来源于stack exchange,提问作者astrocat
相关产品推荐
相关产品推荐

