Golang可执行文件大小

4
我搜索了最近的构建紧凑Go可执行文件的信息,但没有成功。大部分信息似乎都是几年前的。我的程序是标准的hello world,可以在Rosettacode.org上找到。使用Fortran,我得到一个小于100KB的exe文件。而用Go,exe文件却高达2400KB。
我的问题是:是否有编译器开关或pragma应该使用?是否有其他工具或技巧我不知道(我是Go的初学者)?关于可执行文件大小,Go的未来计划是什么?在Linux下是一样的吗?在大型程序中,exe文件会发生什么?
背景:我正在使用安装在Windows 7上的Go 1.5。我的项目是编写(实际上是从其他语言迁移)一些命令行程序。拥有20个或更多的大型Go exe文件会占用很多空间。好吧,我知道空间很便宜,所以我可以接受。但是,我相信这个问题的清晰度将有助于许多人。

3
不确定SE是否是讨论这么多问题的正确地方。也许Go邮件列表会更合适。 - laurent
如果编译器开关或编译指示符没有很好的文档说明,我很乐意听取相关信息。 - Fred
3
阅读此文:Go语言编译出的可执行文件为什么这么大?。Go语言的可执行文件很大是因为它包含了一个支持垃圾回收和运行时反射的运行时环境。Fortran可执行文件不提供这些功能(或者提供的程度不及Go语言)。不用担心,这个运行时环境只会被添加一次,如果你的代码增长,它对输出文件大小的影响不会呈线性增长。 - icza
@icza,非常感谢。很高兴听到它不是线性增长。 - Fred
2个回答

4

有没有办法只包含我需要的内容? - 0xB00B

3
为了减小可执行文件的大小,您可以使用以下方法之一指示链接器剥离调试符号:
go install -ldflags '-s'
go install -ldflags '-s -w'

我尝试对一个相当大的可执行文件进行了测试(GXUI 样例之一),这将其从 ~16M 缩小到了 ~10M。添加 -w 到 -s 没有任何区别,但通常情况下,结果可能会有所不同...

这里 是所有链接器选项的完整列表。


请注意,这与在二进制文件上运行“strip”命令相同。 - Martin Tournoij
1
@Carpetsmoker:完全不是这样——按照我推荐的方法,符号将由Go链接器剥离,这比使用第三方实用程序如“strip”更可靠。这并不牵强,显然,“strip”在过去曾对Go二进制文件产生问题——请参见此处(引用:“剥离go二进制文件将产生从无到微妙到彻底执行失败的任何地方”)。 - rob74
啊,谢谢澄清,它与在二进制文件上运行“strip”的效果相同 :-) - Martin Tournoij
@Carpetsmoker:我自己没有尝试过,但如果我理解正确的话,如果你运气好的话,“strip”将具有相同的效果。如果不是这样,你剥离的二进制文件可能会损坏。Docker的人也非常坚定地认为如此:“请,请,请不要剥离任何已编译的二进制文件”。 - rob74

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