OSX下Cabal安装Haskell包失败:GHC/GCC __STDC_VERSION__ C99兼容问题
解决OSX 10.12.6下GHC 8.2.1 + GCC 4.8.0的Cabal安装失败问题
你的问题核心是GHC 8.2.1要求C编译器必须支持C99标准,但你使用的GCC 4.8.0在OSX 10.12环境下默认没有启用C99模式,导致__STDC_VERSION__宏的值不满足GHC头文件Stg.h的检查,触发了编译错误。下面是几个可行的解决办法:
1. 临时安装指定包时添加C99编译选项
直接在cabal install命令中给GHC传递C编译器的C99参数,比如你要安装optparse-applicative,可以执行:
cabal install optparse-applicative --ghc-option="-optc-std=c99"
这个命令会让GHC调用GCC时强制使用C99标准编译,绕过Stg.h的版本检查。
2. 永久修改Cabal配置,全局生效
如果不想每次安装都手动加参数,可以修改Cabal的配置文件,让所有编译都默认启用C99:
- 打开
~/.cabal/config文件(如果没有就创建一个) - 找到
program-default-options部分(如果没有就新增),添加GHC的编译选项:
program-default-options: ghc: -optc-std=c99
- 保存文件后,后续所有
cabal install命令都会自动带上这个参数,无需再手动指定。
3. 切换到OSX自带的Clang编译器(推荐)
OSX 10.12自带的Clang编译器原生支持C99标准,不会有这个版本宏的问题。你可以指定Cabal使用Clang替代GCC:
cabal install optparse-applicative --ghc-option="-pgmc clang"
如果想永久切换,同样修改~/.cabal/config:
program-default-options: ghc: -pgmc clang
另外,你日志里的gcc: warning: couldn’t understand kern.osversion ‘16.7.0是GCC 4.8对OSX 10.12版本号的识别bug,不过这个警告不影响编译,解决C99的问题后这个警告也会随着编译器的切换或选项的添加不再影响安装流程。
内容的提问来源于stack exchange,提问作者W4t3randWind
相关产品推荐
相关产品推荐

