关于构建Fortran的Makefile中MOD文件的技术疑问
Fortran Makefile 相关问题解答
关于clean目标是否需要包含MOD文件
- 必须将MOD文件(gfortran默认生成小写
.mod,部分编译器是大写.MOD)加入clean目标。原因有两点:- 虽然重新编译模块源文件时,gfortran会自动更新对应的
.mod文件,但如果编译过程中断(比如代码报错终止),旧的.mod可能残留,和新生成的.o文件接口不匹配,导致后续编译出现奇怪的错误。 - 彻底清理所有编译产物是避免过期文件干扰的最稳妥方式,尤其是在频繁修改模块代码的场景下,残留的旧
.mod很容易引发难以排查的问题。
- 虽然重新编译模块源文件时,gfortran会自动更新对应的
关于是否需要将MOD文件设为对应.o文件的依赖
- 必须指定。举个例子:如果模块文件
module.f90编译出module.o和module.mod,主程序main.f90依赖这个模块,那么main.o的依赖列表里必须包含module.mod。 - 因为make是通过文件修改时间判断是否需要重新编译的:如果模块的接口发生变化,
module.mod的修改时间会更新,make会检测到这个变化,自动重新编译依赖它的main.o;如果只把module.o作为依赖,make可能不会触发main.o的重新编译,进而导致运行时错误或者编译失败。
示例Makefile
FC = gfortran FFLAGS = -Wall -O2 # 源文件定义 MODULE_SRC = module.f90 MAIN_SRC = main.f90 # 目标文件与可执行文件 MODULE_OBJ = $(MODULE_SRC:.f90=.o) MAIN_OBJ = $(MAIN_SRC:.f90=.o) EXECUTABLE = main.exe # MOD文件集合(适配gfortran的小写.mod) MOD_FILES = $(MODULE_SRC:.f90=.mod) all: $(EXECUTABLE) # 链接生成可执行文件 $(EXECUTABLE): $(MODULE_OBJ) $(MAIN_OBJ) $(FC) $(FFLAGS) $^ -o $@ # 主程序目标依赖模块的MOD文件 $(MAIN_OBJ): $(MAIN_SRC) $(MOD_FILES) $(FC) $(FFLAGS) -c $< -o $@ # 编译模块文件 $(MODULE_OBJ): $(MODULE_SRC) $(FC) $(FFLAGS) -c $< -o $@ # 清理所有编译产物 clean: rm -f $(MODULE_OBJ) $(MAIN_OBJ) $(MOD_FILES) $(EXECUTABLE)
内容的提问来源于stack exchange,提问作者kris44dad
相关产品推荐
相关产品推荐

