You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于构建Fortran的Makefile中MOD文件的技术疑问

Fortran Makefile 相关问题解答

关于clean目标是否需要包含MOD文件

  • 必须将MOD文件(gfortran默认生成小写.mod,部分编译器是大写.MOD)加入clean目标。原因有两点:
    • 虽然重新编译模块源文件时,gfortran会自动更新对应的.mod文件,但如果编译过程中断(比如代码报错终止),旧的.mod可能残留,和新生成的.o文件接口不匹配,导致后续编译出现奇怪的错误。
    • 彻底清理所有编译产物是避免过期文件干扰的最稳妥方式,尤其是在频繁修改模块代码的场景下,残留的旧.mod很容易引发难以排查的问题。

关于是否需要将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:03:22