M1 Mac(AARCH64)用Cabal编译x86_64程序遇strict_import跨编译错误
解决M1 Mac上Cabal构建x86_64可执行文件时bzlib-conduit编译失败问题
核心问题分析
报错中的strict_import是旧版HSC文件使用的过时指令,在交叉编译模式下GHC配套的hsc2hs工具无法处理该指令。即使通过arch -x86_64切换子shell,若配套工具链(如hsc2hs、ghc-pkg)仍为ARM架构版本,仍会触发该错误。
解决方案
1. 升级bzlib-conduit依赖版本
bzlib-conduit 0.3.0.2版本较老旧,后续版本(如0.3.1及以上)已移除strict_import这类过时指令,解决了交叉编译兼容性问题:
- 在项目的
cabal.project文件中添加版本约束:constraints: bzlib-conduit >= 0.3.1 - 或直接修改项目
.cabal文件中的依赖声明,将bzlib-conduit == 0.3.0.2替换为bzlib-conduit >= 0.3.1
2. 完整指定x86_64架构的工具链
仅指定--with-compiler不足以保证所有工具都匹配架构,需同时指定ghc-pkg、hsc2hs等配套工具:
- 执行完整构建命令:
cabal --with-compiler="/Users/Me/.stack/programs/x86_64-osx/ghc-9.2.3/bin/ghc" \ --with-ghc-pkg="/Users/Me/.stack/programs/x86_64-osx/ghc-9.2.3/bin/ghc-pkg" \ --with-hsc2hs="/Users/Me/.stack/programs/x86_64-osx/ghc-9.2.3/bin/hsc2hs" \ --store-dir=.cabal-store build
3. 切换到Stack构建(推荐)
Stack对多架构编译的支持更完善,可自动管理匹配架构的工具链:
- 在项目的
stack.yaml中添加架构指定:arch: x86_64 - 直接执行构建命令:
stack build
4. 手动修改bzlib-conduit源码(临时应急方案)
若无法升级依赖,可手动移除问题指令:
- 下载bzlib-conduit 0.3.0.2源码到本地:
cabal get bzlib-conduit-0.3.0.2 - 打开
src/Data/Conduit/BZlib/Internal.hsc,删除第8行的#strict_import指令 - 在
cabal.project中指定使用本地修改后的包:packages: ./bzlib-conduit-0.3.0.2 - 重新执行构建命令
内容的提问来源于stack exchange,提问作者RandomB
相关产品推荐
相关产品推荐

