用GHC编译的小型Haskell程序,转换成巨大的二进制文件
|
甚至很小的Haskell程序也变成了巨大的可执行文件。
我已经编写了一个小程序,该程序已用GHC编译为二进制文件,大小扩展了7 MB!
哪怕是很小的Haskell程序也可以编译成巨大的二进制文件?
我可以采取什么措施来减少这种情况?
没有找到相关结果
已邀请:
2 个回复
掸牛浓疗
从“ 1”输出中可以看到,GHC生成了动态链接的可执行文件,但是只有C库是动态链接的!所有Haskell库均逐字复制。 另外:由于这是一个图形密集型应用程序,因此我肯定会用
进行编译 您可以做两件事。 剥离符号 一个简单的解决方案:剥离二进制文件:
Strip会从目标文件中丢弃符号。通常仅在调试时需要它们。 动态链接的Haskell库 最近,GHC获得了对C和Haskell库的动态链接的支持。现在,大多数发行版都发行了GHC版本,该版本旨在支持Haskell库的动态链接。共享的Haskell库可以在许多Haskell程序之间共享,而不必每次都将它们复制到可执行文件中。 在撰写本文时,支持Linux和Windows。 为了允许Haskell库动态链接,您需要使用
对其进行编译,如下所示:
另外,您要共享的任何库都应使用
构建:
最后,您将得到一个更小的可执行文件,该文件具有动态解析的C和Haskell依赖关系。
而且,瞧!
您可以剥离以使其更小:
一个讨厌的可执行文件,由许多动态链接的C和Haskell片段构建而成:
最后一点:即使在仅具有静态链接的系统上,也可以使用-split-objs为每个顶级功能获取一个.o文件,这可以进一步减少静态链接库的大小。它需要使用-split-objs构建GHC,有些系统会忘记这样做。
焙恍挝厂熄