M1芯片Mac构建含persistent-postgresql的Haskell项目失败如何解决
问题原因
你遇到的符号找不到错误核心是架构不匹配导致的:M1芯片Mac上brew默认安装的PostgreSQL 13是arm64架构,而你使用的nightly-2021-09-02版本resolver默认运行在x86_64转译环境下,编译postgresql-libpq时链接的库架构不一致,最终加载动态库时找不到_PQclear等原生符号。
解决方案(推荐原生arm64架构方案)
- 首先切换到未开启Rosetta转译的原生终端,执行
arch命令确认输出为arm64 - 清除之前的x86架构构建缓存:
stack clean --full
- 替换
stack.yaml中的resolver为对M1兼容性更好的LTS版本,对应GHC 9.0.x,完全兼容你现有代码的derivePersistField语法:
resolver: lts-19.33
- 在
stack.yaml末尾添加brew安装的PostgreSQL 13的头文件和库路径,避免编译时找不到依赖:
extra-include-dirs: - /opt/homebrew/opt/postgresql@13/include extra-lib-dirs: - /opt/homebrew/opt/postgresql@13/lib
- 先单独重编译PostgreSQL相关依赖,再整体构建项目:
stack build postgresql-libpq --force-dirty stack build
可选方案(保留Rosetta转译环境)
如果你必须使用x86_64架构的stack环境,按以下步骤操作:
- 右键点击终端应用,选择「显示简介」,勾选「使用Rosetta打开」后重启终端
- 安装x86架构版本的Homebrew:
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- 使用x86版本brew安装PostgreSQL 13:
arch -x86_64 /usr/local/bin/brew install postgresql@13
- 在
stack.yaml中指定x86版本PostgreSQL的依赖路径:
extra-include-dirs: - /usr/local/opt/postgresql@13/include extra-lib-dirs: - /usr/local/opt/postgresql@13/lib
- 执行
stack build即可完成构建
内容的提问来源于stack exchange,提问作者Geradlus_RU
相关产品推荐
相关产品推荐

