繁体   English   中英

Haskell工具堆栈和可执行文件大小

[英]Haskell Tool Stack and executable size

我使用堆栈工具创建了一个Haskell CLI。 感谢Travis,我已经成功设置了交叉编译功能,但是我不明白为什么linux(6MB),osx(2MB)和Windows(18MB!)之间的可执行文件大小如此不同。 怎么来的?

发布: https : //github.com/unfog-io/unfog-cli/releases/tag/v0.1.2

特拉维斯会议: https : //github.com/unfog-io/unfog-cli/blob/master/.travis.yml

编辑

当我用tar.gz压缩可执行文件时,我减少了差异,但是还是! 我现在有linux(1.35MB),osx(0.61MB),windows(3.93MB)(请参阅发行版

Linux和MacOS版本之间的差异可能是由于所谓的“ 分割部分 ”。

在Linux上启用-split-sections GHC标志会将每个已编译的函数置于其自己的链接器节中(而不是将所有函数置于单个“ .text”节中的传统方法)。 这使链接器可以丢弃没有使用的代码,否则就无法实现粒度。

不幸的是, 所有依赖都需要使用此标志来构建才能受益。 您可以通过stack.yaml添加到项目的stack.yaml文件中来强制Stack正确地重建所有内容:

ghc-options:
    "$everything": -split-sections

指定依赖项GHC选择的方法被记录在这里

如果您通过此更改重建unfog ,则实际上将从头开始重建“ base”和“ vector”以及其他所有内容,因此可能需要一段时间。 但是,生成的二进制文件值得。 不剥皮,它的大小从大约11Meg下降到4Meg,并且如果您剥离它,它只是:

-rwxr-xr-x 1 buhr buhr 1494696 Nov 27 19:40 unfog

甚至比您发布的MacOS版本还要小。

现在,据我所知,原始MacOS版本仅为2Meg的原因是MacOS链接器已经实现了类似于拆分部分的功能。 我不确定是否为MacOS构建启用-split-sections可能会带来额外收益,或者-split-sections是否是MacOS下的自动默认设置。 无论如何,尝试它不会有什么坏处。

对于Windows,它如此巨大的主要原因是,MinGW GCC工具链用于编译Windows二进制文件,因此存在GNU类库的完整兼容性层(libc,libm,libpthread,libgmp等),并且-不像使用Linux和MacOS版本-它们都被静态链接到Windows二进制文件中。 Windows的唯一动态链接是到标准Windows DLL。

请注意, -split-sections在Windows上可能会或可能不会起作用。 在错误跟踪器上有一些注释使其不清楚。 无论如何,可能值得尝试一下是否有所作为。

一些其他参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM