【问题标题】:Golang executable size [duplicate]Golang可执行文件大小[重复]
【发布时间】:2015-09-17 18:24:28
【问题描述】:

我搜索了有关构建紧凑 Go 可执行文件的最新信息,但没有成功。大多数信息似乎已有数年历史。

我的程序:Rosettacode.org 上的标准 hello world。 使用 Fortran,我得到一个 100 KB 以下的 exe 文件。使用 Go,exe 文件高达 2400 KB。

我的问题:是否有我应该使用的编译器开关或编译指示?还有其他我不知道的工具或技巧(我是 Go 的初学者)。 Go 在可执行文件大小方面的未来计划是什么?在 Linux 下是什么样的——同样的事情?大型程序上的 exe 文件会发生什么?

背景:我正在使用安装在 Windows 7 上的 go 1.5。我的项目正在编写(实际上是从其他语言迁移)一些命令行程序。拥有 20 个或更多的大型 Go exe 文件会占用大量空间。好吧,我知道空间很便宜,所以我可以忍受。不过,我相信澄清这件事会对很多人有所帮助。

【问题讨论】:

  • 不确定 SE 是否适合讨论这么多问题。也许 Go 邮件列表会更合适。
  • 我很高兴听到有关编译器开关或编译指示的信息,特别是如果它们没有很好的文档记录。
  • 阅读:Reason for huge size of compiled executable of Go。 Go 可执行文件很大,因为它包含一个支持 gc 和运行时反射的运行时。 Fortran exe 不向您提供(或与 Go 相当的级别)。不用担心,运行时只添加一次,如果您的代码增长,它将不会与输出的大小成线性关系。
  • @icza,非常感谢。很高兴听到这不是线性增长。

标签: go


【解决方案1】:

Go 程序很大,因为它包含垃圾收集代码、goroutine 调度代码以及几乎所有静态链接的库。这是设计使然。

FAQ Why is my trivial program such a large binary

【讨论】:

  • 有什么办法只包含我需要的东西吗?
【解决方案2】:

要减小可执行文件的大小,您可以使用以下方法之一指示链接器去除调试符号:

go install -ldflags '-s'
go install -ldflags '-s -w'

我在一个相当大的可执行文件(GXUI 样本之一)上进行了尝试,这将它从 ~16M 减少到 ~10M。将 -w 添加到 -s 没有任何区别,但与往常一样,您的里程可能会有所不同......

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

【讨论】:

  • 请注意,这与在二进制文件上运行 strip 相同。
  • @Carpetsmoker:完全没有——在我推荐的方法中,符号被 Go 链接器剥离,这比 strip 等第三方实用程序更可靠地工作。这并不牵强,显然strip 过去曾对 Go 二进制文件产生过问题 - 请参阅 here (引用:“剥离 go 二进制文件将产生从无到细微到彻底执行失败的任何地方”)
  • 啊;感谢您的澄清;它与在二进制文件上运行strip 具有相同的效果 :-)
  • @Carpetsmoker:我自己没试过,但如果我理解正确的话,strip会有同样的效果如果你幸运的话。如果没有,您剥离的二进制文件可能会损坏。 The Docker guys are really adamant about this too:“请,请,请不要剥离任何已编译的二进制文件”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2022-01-13
相关资源
最近更新 更多