macOS下构建Haskell可执行文件如何指定部署目标版本
macOS下Haskell工具链指定部署目标的配置方法
以下方案均等效于Clang的-mmacosx-version-min编译参数,可自定义二进制的LC_BUILD_VERSION minos值,兼容旧版本macOS系统。
通用方案(适用于GHC/Cabal/Stack所有工具链)
优先推荐使用环境变量配置,无需修改项目文件,全局生效:
- 构建前执行命令设置目标版本,示例为设置最低兼容10.15版本:
该变量会被GHC底层的编译、链接环节自动识别,自动传递对应参数给Clang编译器和链接器。export MACOSX_DEPLOYMENT_TARGET=10.15
各工具单独配置方案
如果不需要全局生效,可按工具单独配置:
Cabal配置
- 单次构建临时生效:
执行构建命令时传入对应参数:
cabal build --ghc-option="-optc-mmaccosx-version-min=10.15" --ghc-option="-optl-mmaccosx-version-min=10.15"
- 项目级永久生效:
在项目根目录的cabal.project文件中添加如下配置:
package * ghc-options: -optc-mmaccosx-version-min=10.15 -optl-mmaccosx-version-min=10.15
Stack配置
- 单次构建临时生效:
执行构建命令时传入对应参数:
stack build --ghc-options="-optc-mmaccosx-version-min=10.15 -optl-mmaccosx-version-min=10.15"
- 项目级永久生效:
在项目根目录的stack.yaml文件中添加如下配置:
ghc-options: "$everything": -optc-mmaccosx-version-min=10.15 -optl-mmaccosx-version-min=10.15
直接调用GHC时配置
如果手动调用GHC编译单个文件,直接传入参数即可:
ghc Main.hs -optc-mmaccosx-version-min=10.15 -optl-mmaccosx-version-min=10.15
验证配置生效
构建前先清空原有构建缓存避免旧文件干扰:
- Cabal执行
cabal clean - Stack执行
stack clean
重新构建完成后执行以下命令验证minos值是否符合预期:
otool -l ./lamdu | grep minos
内容的提问来源于stack exchange,提问作者yairchu
相关产品推荐
相关产品推荐

