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

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目录层级,链接器同样无法写入文件

第一步:修复路径问题

  1. 先确认输出目录存在,终端执行命令自动创建缺失的目录层级:
    mkdir -p ~/Desktop/Research/bin
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:51:21