如何移除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
相关产品推荐
相关产品推荐

