编译Agda时遇GHC与clang链接器(ld)错误求助
解决GHC 9.8.2与clang链接器
-no_warn_duplicate_libraries错误 问题说明
在macOS上通过brew安装的GHC 9.8.2,编译Agda程序或纯Haskell程序时,链接阶段都会报错:
ld: unknown option: -no_warn_duplicate_libraries clang: error: linker command failed with exit code 1 (use -v to see invocation) ghc-9.8.2: `clang' failed in phase `Linker'. (Exit code: 1)
即便在zsh里设置clang别名指向gcc-13,错误依旧——因为GHC会直接调用系统中的clang可执行文件,不会解析shell别名。
解决方案
1. 单次编译时指定GHC使用gcc作为链接器
编译Agda程序时,给agda传递GHC参数,强制使用gcc-13作为编译器和链接器:
agda --compile --ghc-opt=-pgmc=gcc-13 --ghc-opt=-pgml=gcc-13 hello-world.agda
编译纯Haskell程序时,直接给ghc加参数:
ghc -pgmc=gcc-13 -pgml=gcc-13 -o hello hello.hs
参数说明:
-pgmc=gcc-13:指定C编译器为gcc-13-pgml=gcc-13:指定链接器为gcc-13
2. 永久配置GHC默认使用gcc
如果不想每次编译都加参数,可以修改GHC的全局配置:
- 找到GHC的settings文件,路径通常是
~/.ghc/x86_64-darwin-9.8.2/settings(根据你的架构和版本调整) - 打开文件,找到
("C compiler command", "clang")和("Linker command", "clang")这两行,把clang替换为gcc-13 - 保存文件后,后续GHC编译会自动使用gcc-13
或者通过环境变量配置,在~/.zshrc里添加:
export GHC_OPTS="-pgmc=gcc-13 -pgml=gcc-13"
执行source ~/.zshrc生效后,编译时无需手动加参数。
3. 降级clang到兼容版本
如果不想用gcc,可以尝试使用Xcode自带的clang(而非Homebrew的新版),执行以下命令切换:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
Xcode自带的clang版本通常会兼容GHC传递的链接器选项。
关于GHC修复进度
该问题已在GHC官方issue中记录,后续版本会修复该兼容性问题,但当前版本通过上述临时方案即可正常编译,无需等待修复。
内容的提问来源于stack exchange,提问作者shingo.nakanishi
相关产品推荐
相关产品推荐

