macOS M1(Monterey)下Nix安装Agda链接失败求助
问题概述
在搭载Monterey系统的M1架构macOS设备上,执行nix-shell -p agda安装Agda时,编译过程正常完成,但链接阶段触发段错误,核心报错如下:
clang-11: error: linker command failed with exit code 139 (use -v to see invocation) `cc' failed in phase `Linker'. (Exit code: 139)
完整构建日志显示链接器/nix/store/gwm9iadcyybh7gc4q6djvaz4fb40i90c-cctools-binutils-darwin-949.0.1/bin/ld触发了Segmentation fault: 11。此前安装其他Haskell包时,曾通过设置export C_INCLUDE_PATH="$(xcrun --show-sdk-path)/usr/include/ffi"解决GHC找不到libffi/zlib的问题,但本次报错原因不明。
可能原因
- 架构兼容性问题:M1为arm64架构,部分旧版Nix工具链(如cctools-binutils)在arm64环境下存在bug,导致链接器崩溃
- 依赖库架构不匹配:链接过程中调用的某些C依赖库可能是x86_64版本,与arm64的编译产物不兼容
- Nixpkgs版本过旧:当前使用的Nixpkgs版本中,Agda 2.6.2.2的构建脚本未适配M1架构,或依赖的GHC版本对arm64支持不完善
排查步骤
确认Nix运行架构
执行以下命令查看当前Nix的系统架构:nix-shell -p nix-info --run "nix-info -m"输出中的
system字段应为aarch64-darwin,如果显示x86_64-darwin,说明当前在Rosetta兼容模式下运行。获取详细链接日志
重新构建Agda并输出详细链接命令,便于定位问题:nix-build -E 'with import <nixpkgs> {}; agda' -v 2>&1 | grep -A 20 "Linking"查看具体链接的库文件路径,后续可通过
file命令验证库的架构。检查依赖库架构
以libffi为例,验证其是否为arm64版本:nix-shell -p libffi --run "file $(nix-build -A libffi)/lib/libffi.dylib"输出应包含
arm64,如果显示x86_64则说明依赖库架构不匹配。验证Nixpkgs分支兼容性
尝试切换到Nixpkgs不稳定分支,该分支对M1的支持更完善:nix-shell -I nixpkgs=channel:nixpkgs-unstable -p agda如果安装成功,说明旧版本Nixpkgs存在适配问题。
解决方案建议
升级到Nixpkgs不稳定分支:长期来看,使用unstable分支能获得更完善的M1架构支持,可执行以下命令切换默认分支:
nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs nix-channel --update之后再执行
nix-shell -p agda尝试安装。指定适配M1的GHC版本:通过Haskell包集指定更适配arm64的GHC版本构建Agda:
nix-shell -p "haskellPackages.ghcWithPackages (p: [p.agda])"补充链接阶段环境变量:尝试设置LIBRARY_PATH确保链接器能找到系统库:
export LIBRARY_PATH="$(xcrun --show-sdk-path)/usr/lib" nix-shell -p agda临时使用Rosetta兼容模式:如果以上方法均无效,可切换到x86_64兼容环境安装:
arch -x86_64 zsh nix-shell -p agda
内容的提问来源于stack exchange,提问作者alessandro candolini

