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

如何移除GHC编译二进制文件对terminfo包的依赖?

移除GHC默认依赖中的terminfo包

问题现象

编译生成的Haskell可执行文件在缺少libtinfo的环境中运行时报错:

./Main: error while loading shared libraries: libtinfo.so.6: cannot 
open shared object file: No such file or directory

简洁解决方案

方法1:编译时跳过默认环境文件

直接使用--no-environment参数编译,避免加载Cabal初始化后生成的默认环境配置,GHC就不会自动引入terminfo依赖:

ghc --no-environment --make Main.hs

无需手动枚举所有依赖,适合快速解决问题。

方法2:修改默认环境配置文件

若需要长期生效,编辑~/.ghc/x86_64-linux-8.10.7/environments/default文件,找到包含terminfo的行并删除,保存后重新编译即可。

方法3:通过Cabal明确管理依赖

如果用Cabal管理项目,在.cabal文件中只列出实际需要的依赖,避免引入不必要的包:

executable Main
  main-is:             Main.hs
  build-depends:       base >= 4.14 && < 5
                      , containers
                      , array
                      -- 仅添加项目实际用到的依赖
  default-language:    Haskell2010

执行cabal build编译后,生成的可执行文件不会包含terminfo依赖。

为什么-hide-package/-ignore-package不生效?

Cabal初始化后生成的默认环境文件中包含ghc包,而ghc包依赖terminfo。单独使用-ignore-package terminfo时,GHC会因ghc包的依赖要求无法忽略它;若同时忽略ghc包,又会出现依赖缺失的错误,因此这类参数无法直接解决问题。

额外发现

  • 全新安装的GHC(未初始化Cabal)编译出的可执行文件不会依赖libtinfo,因为此时没有加载包含ghc包的默认环境。
  • strip等工具无法消除该依赖,这是编译阶段引入的动态库依赖,并非可执行文件中的冗余符号。

内容的提问来源于stack exchange,提问作者Keigo Imai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:09:21