如何强制gfortran优先搜索-J参数指定目录的.mod模块文件
现象原因
gfortran官方手册对-J参数的说明没有提及一个默认的高优先级搜索规则:编译任意源文件时,该源文件自身存放的目录,永远是.mod文件搜索的第一优先级,高于-J、-I指定的路径,也高于执行编译命令时的当前工作目录。
你执行编译命令时传入的源文件路径是src/main.f90,gfortran会自动把src/放到mod搜索路径的最前端,因此会优先读取src目录下ifort生成的、格式不兼容的mmm.mod,直接触发格式错误,不会再继续搜索obj/目录下gfortran自身生成的合法mod文件。
解决方法
按可靠性从高到低排序:
- 从根源隔离源码和编译产物(最推荐,大型Fortran项目通用规范)
首先彻底清理源码目录下的所有编译生成文件,永远不要把不同编译器、不同编译配置生成的.mod、.o文件和源码放在同一目录:
后续编译所有文件时,统一通过# 清理src目录下误放的编译产物 rm -f src/*.mod src/*.o-J参数指定mod文件输出到独立的obj目录,目标文件也通过-o指定输出到obj目录:
如果需要同时支持多编译器,为每个编译器建立独立的产物子目录即可,比如gfortran产物放# 先编译模块文件 gfortran -c src/mod.f90 -o obj/mod.o -J obj # 再编译主程序,此时src目录下无多余mod文件,搜索到obj目录即可找到正确文件 gfortran -c src/main.f90 -o obj/main.o -J objobj/gfortran/,ifort产物放obj/ifort/,从目录结构上彻底避免不兼容mod文件被误读。 - 临时取消源文件目录的默认搜索优先级
如果暂时无法清理src目录下的其他编译器产物,可以在编译命令中加入-I-参数,该参数会取消源文件所在目录的默认最高搜索优先级,让gfortran严格按照你传入的-J、-I参数顺序搜索mod文件:
注意部分高版本gfortran会标记gfortran -c src/main.f90 -o obj/main.o -J obj -I- -I obj-I-为过时参数,这种场景下优先使用第一种目录隔离方案,稳定性最高。
内容的提问来源于stack exchange,提问作者Eular
相关产品推荐
相关产品推荐

