MacBook M1下gfortran编译Fortran报ld无法写入输出文件问题求助
M1 Mac gfortran编译链接报错errno=2解决方案
报错信息
ld: can't open output file for writing: /Desktop/Research/bin/MAC1D, errno=2 for architecture arm64 collect2: error: ld returned 1 exit status
核心成因
类Unix系统中errno=2对应错误为目标路径不存在,你Makefile中配置的输出路径/Desktop/Research/bin是错误的绝对路径:
- Mac系统不存在根目录下的
/Desktop路径,用户桌面的真实路径为/Users/[你的用户名]/Desktop,即~/Desktop - 即使路径前缀正确,若未提前创建
Research/bin目录层级,链接器同样无法写入文件
第一步:修复路径问题
- 先确认输出目录存在,终端执行命令自动创建缺失的目录层级:
mkdir -p ~/Desktop/Research/bin - 修改Makefile中
BIN变量配置,替换为正确路径:# 用~指代当前用户目录,无需硬编码用户名 BIN = ~/Desktop/Research/bin
第二步:修复Makefile中其他会导致编译失败的语法/逻辑错误
你当前的Makefile还有4处隐藏问题,路径修复后依然会触发编译失败,一并修正:
SOURCES变量的wildcard函数未闭合,缺少右括号- 注释中的优化选项
O2缺少参数前缀-,开启优化时会报错 .o和.mod生成规则重复编译源文件,且用mv *.o obj的方式挪动文件,并行编译时会出现文件找不到的问题- 最终链接目标的依赖未关联带路径的
$(OBJS),会触发make的依赖查找错误
修正后的核心配置段参考:
vpath %.f90 src FC = gfortran FFLAGS = -g -fcheck=all -Wall -fbacktrace # 开启优化时使用下方配置 # FFLAGS = -O2 BIN = ~/Desktop/Research/bin MOD = include OBJ = obj SRC = src # 编译前自动创建所有需要的输出目录,避免目录不存在报错 $(shell mkdir -p $(BIN) $(MOD) $(OBJ)) SOURCES = $(wildcard $(SRC)/*.f90) OBJECTS = vars.o idata.o grids.o mac1d_sch.o fieldinit.o coder.o postpr.o mac1d.o MODULES = vars.mod idata.mod grids.mod mac1d_sch.mod fieldinit.mod coder.mod postpr.mod .PHONY: clean cleano OBJS = $(patsubst %.o, $(OBJ)/%.o, $(OBJECTS) ) print-% : ; @echo $* = $($*) $(BIN)/MAC1D: $(OBJS) $(FC) $(FFLAGS) $(OBJS) -o $@ # 统一编译规则:直接将.o文件输出到obj目录,同时生成.mod文件到include目录 $(OBJ)/%.o: %.f90 $(FC) -I$(MOD) -J$(MOD) -c $(FFLAGS) $< -o $@ clean: rm -f $(OBJ)/*.o $(MOD)/*.mod $(BIN)/MAC1D cleano: rm -f $(OBJ)/*.o
验证
修改完成后,在项目根目录先执行make clean清理旧的编译产物,再执行make即可正常完成编译,生成的可执行文件会出现在你指定的~/Desktop/Research/bin目录下。
内容的提问来源于stack exchange,提问作者Urmish
相关产品推荐
相关产品推荐

