在部署中的Haskell静态链接和动态链接

6
为什么cabal install默认不使用--enable-shared标志?我注意到,当没有使用此标志编译简单的程序时,文件大小会变得很大。这是有关Haskell程序如何轻松部署为单个自包含二进制文件的设计选择吗?

1
我记得共享库支持是相当新的,不适用于所有平台,而且会使可执行文件的分发更加困难。但空间很便宜,那又怎样呢?不过,肯定会有更好的答案出现。 - luqui
1
@luqui:存储空间可能很便宜,但带宽呢?如果你需要通过互联网向连接质量不佳的客户推送20MB程序的更新,该怎么办? - Joey Adams
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - mb21
1个回答

4
我认为这与缺乏支持有关。然而,我无法得到一个明确的答案,即 GHC 是否支持动态链接。GHC维基页面SharedLibraries/PlatformSupport已经两年没有更新了。
在Windows上,我尝试使用--enable-shared构建一堆包,包括我编写的一个简单程序,该程序使用http-enumerator每30秒从URL下载。当我运行程序时(在将所有DLL放入我的程序文件夹后),它在几秒钟后崩溃了。当我使用--threaded编译时,它立即崩溃。
我在GHC 7.0.3中尝试了这个。该版本的文档页面说:
目前在Windows上将Haskell库制作成DLL是不可行的,我们希望在未来重新启用这个功能(请参阅第4.12节“使用共享库”)... 这个通知在后续版本中已经不再出现。
顺便提一下,除了代码大小之外,静态二进制文件还有另一个麻烦。 GHC 使用 GMP 来支持大整数计算。 GMP 的许可证是LGPL。这意味着如果您需要分发专有二进制文件,或者您有一个不兼容 GPL 的依赖项(例如 OpenSSL),则需要分发您的目标文件以遵守 GMP 的许可证。要么这样做,要么找到一种方法使 libgmp 动态链接。我想知道如何做到这一点。

1
截至2015年3月,这个答案是否仍然有效? - Erik Kaplun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接