如何设置GHC与Cabal默认生成动态链接二进制文件及库?
嘿,我来帮你搞定这个问题!针对你在Ubuntu 16.04上通过apt安装的GHC 8.2.2,我们可以通过修改配置文件,让GHC和cabal默认生成动态链接的二进制文件与库,不用每次手动敲一堆参数~
一、让Cabal默认启用动态链接(最推荐的方式)
因为你主要是用cabal install来构建项目,直接修改Cabal的全局配置文件是最省心的:
- 打开你的用户级Cabal配置文件,路径是
~/.cabal/config(如果不存在,先执行一次cabal update生成)。 - 在文件里找到或者添加以下配置项:
要是你看到的是带# 启用动态库构建 shared: True # 启用动态链接的可执行文件 executable-dynamic: True--注释的旧格式,比如--enable-shared: False,直接把--去掉,把False改成True就行。
保存配置后,以后再执行cabal install,就会自动给所有依赖和项目加上--enable-shared --enable-executable-dynamic参数,默认生成动态链接的产物了。
二、针对单个项目的临时配置(不想改全局的话)
如果只想让某个项目默认用动态链接,不用改全局配置,就在项目根目录下创建一个cabal.project文件,写入:
packages: . shared: True executable-dynamic: True
这样只有这个项目构建时会用动态链接,其他项目不受影响。
三、直接给GHC设置默认参数(可选)
如果你想让GHC本身默认生成动态链接的二进制文件,可以通过设置环境变量GHC_OPTS:
export GHC_OPTS="-dynamic"
把这行加到你的~/.bashrc或者~/.zshrc里,每次终端启动就会生效。不过这种方式只影响直接用ghc编译的情况,cabal还是会自己管理参数,所以更推荐前面的Cabal配置方式。
四、注意事项
- 因为你是用apt安装的GHC,系统里应该已经自带了必要的动态库依赖,但如果遇到某个包构建失败说找不到动态库,可以试试用
apt-get install libghc-<package-name>-dev安装对应的开发包。 - 少数比较旧的Haskell包可能不支持动态链接,如果遇到这类情况,可以临时跳过动态链接,比如执行
cabal install --disable-shared --disable-executable-dynamic <package-name>来单独处理这个包。 - 动态链接的可执行文件体积会小很多,但运行时依赖系统中的Haskell动态库,部署到其他机器时要确保目标机器安装了对应的库哦。
内容的提问来源于stack exchange,提问作者thor
相关产品推荐
相关产品推荐

