【问题标题】:Haskell Static vs Dynamic Linking in Deployment部署中的 Haskell 静态与动态链接
【发布时间】:2011-10-21 19:56:20
【问题描述】:

为什么cabal install 默认不使用标志--enable-shared?我注意到,在没有此标志的情况下编译的琐碎程序会变得很大文件大小。有联系吗?这是一个设计选择,与如何将 Haskell 程序轻松部署在一个独立的二进制文件中有关吗?

【问题讨论】:

  • ISTR 对共享库的支持是相当新的,并不适用于所有平台,也使得分发可执行文件变得更加困难。而且空间很便宜,所以谁在乎呢?不过会有更好的答案。
  • @luqui:空间可能很便宜,但带宽呢?如果您需要通过 Internet 将 20MB 程序的更新推送给连接不太理想的客户端怎么办?

标签: deployment haskell dynamic-linking static-linking code-size


【解决方案1】:

我认为这与缺乏支持有关。但是,我无法直接回答 GHC 目前是否支持动态链接。 GHC wiki 页面SharedLibraries/PlatformSupport 已有两年历史。

在 Windows 上,我尝试使用 --enable-shared 构建一大堆包,包括我编写的一个简单程序,它使用 http-enumerator 每 30 秒从 URL 下载一次。当我运行程序时(在将所有 DLL 与我的程序放在一个文件夹中之后),它在几秒钟后出现了段错误。当我使用--threaded 编译时,它立即出现了段错误。

我在 GHC 7.0.3 中尝试过这个。 documentation page for that version 说:

目前,将 Haskell 库转换为 DLL 无法在 Windows 上运行;我们希望在未来恢复这个功能(参见第 4.12 节,“使用共享库”)。 ...

此通知不会出现在以后的版本中。


顺便说一句,除了代码大小之外,静态二进制文件还有另一个麻烦。 GHC 使用GMP 来支持大整数。 GMP 根据 LGPL 获得许可。这意味着如果您需要分发专有二进制文件,或者如果您有一个不兼容 GPL 的依赖项(例如 OpenSSL),您将需要分发您的目标文件以符合 GMP 的许可证。要么,要么找到一种方法让 libgmp 动态链接。我想知道该怎么做。

【讨论】:

  • 这个答案在 2015 年 3 月仍然有效吗?
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 2012-03-22
  • 2010-11-03
  • 1970-01-01
相关资源
最近更新 更多