Haskell静态与部署中的动态链接

时间:2011-10-21 19:56:20

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

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

1 个答案:

答案 0 :(得分:4)

我认为这与缺乏支持有关。但是,我无法直接回答GHC目前是否支持动态链接。 GHC维基页面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动态链接。我想知道该怎么做。