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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:21