当前位置:  开发笔记 > 编程语言 > 正文

如何减少编译文件的大小?

如何解决《如何减少编译文件的大小?》经验,为你挑选了7个好方法。

让比较c和go:Hello_world.c:

#include
int main(){
    printf("Hello world!");
}

Hello_world.go:

package main
import "fmt"
func main(){
    fmt.Printf("Hello world!")
}

编译两者:

$gcc Hello_world.c -o Hello_c 
$8g Hello_world.go -o Hello_go.8
$8l Hello_go.8 -o Hello_go

还有,这是什么?

$ls -ls
... 5,4K 2010-10-05 11:09 Hello_c
... 991K 2010-10-05 11:17 Hello_go

关于1Mb你好世界.你在跟我开玩笑吗?我做错了什么?

(剥离Hello_go - >仅限893K)



1> Amged Rustom..:

如果您使用的是基于Unix的系统(例如Linux或Mac OSX),您可以尝试通过使用-w标志构建它来删除可执行文件中包含的调试信息:

go build -ldflags "-w" prog.go

文件大小显着减少.

有关更多详细信息,请访问GDB的页面:http://golang.org/doc/gdb


@Axel:明确表示不支持剥离二进制文件,并且在某些情况下可能会导致严重的错误.见[这里](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=717172).
目前文档列出了`-w`,而不是`-s`.不确定区别是什么,但您可能想更新您的答案:-)
`strip`命令也是如此:`go build prog.go; strip prog`然后我们得到了所谓的_striped_ executable:ELF 64位LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),**剥离**

2> OneOfOne..:

2016答案:

1.使用Go 1.7

2.编译 go build -ldflags "-s -w"

? ls -lh hello
-rwxr-xr-x 1 oneofone oneofone 976K May 26 20:49 hello*

3.然后使用upx,goupx自1.6以来不再需要.

? ls -lh hello
-rwxr-xr-x 1 oneofone oneofone 367K May 26 20:49 hello*


我想在此添加关于UPX的常见警告可能适用于此处.有关详细信息,请参阅此处:http://stackoverflow.com/questions/353634/are-there-any-downsides-to-using-upx-to-compress-a-windows-executable(其中大部分适用于非Windows操作系统也是如此).

3> Dirk Vollmar..:

这个文件更大是一个问题吗?我不知道Go但我会假设它静态地链接了一些运行时库,这不是C程序的情况.但是一旦你的程序变大,可能就没什么可担心的了.

如上所述这里,静态链接Go运行时是默认的.该页面还告诉您如何设置动态链接.


有一个[开放问题](https://github.com/golang/go/issues/6853),里程碑设置为Go1.5

4> Evan Shaw..:

Go二进制文件很大,因为它们是静态链接的(除了使用cgo的库绑定).尝试静态链接C程序,你会发现它增长到相当的大小.

如果这对你来说真的是个问题(我很难相信),你可以用gccgo编译并动态链接.


对于一种尚未普遍采用的语言来说,这是一个很好的举动.没有人对使用go系统库混乱他们的系统感兴趣.
我认为链接的文章反过来说 - Go创建者显然更喜欢静态链接.
Go创建者明确更喜欢动态链接:http://harmful.cat-v.org/software/dynamic-linking/.Google静态链接其所有C和C++:http://www.reddit.com/r/golang/comments/tqudb/are_go_binaries_really_entirely_statically_linked/c4p1awi

5> marcio..:

你应该得到goupx,它将"修复"Golang ELF可执行文件upx.在某些情况下,我已经有大约78%的文件缩小了~16MB >> ~3MB.

压缩比通常趋于25%,所以值得一试:

$ go get github.com/pwaller/goupx
$ go build -o filename
$ goupx filename

>>

2014/12/25 10:10:54 File fixed!

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
  16271132 ->   3647116   22.41%  linux/ElfAMD   filename                            

Packed 1 file.

EXTRA:-sflag(strip)可以进一步缩小bin文件goupx -s filename


从Go 1.6开始不再需要这个,你可以使用正常的upx.

6> Alexander I...:

更紧凑的hello-world示例:

package main

func main() {
  print("Hello world!")
}

我们喜欢大fmt包装和显着减少二进制:

  $ go build hello.go
  $ ls -lh hello
  ... 259K ... hello2
  $ strip hello
  $ ls -lh hello
  ... 162K ... hello2

不像C那么紧凑,但是用K而不是M来测量:)好吧,这不是一般的方式只是显示一些优化大小的方法:使用strip并尝试使用最小的包.无论如何Go不是制作小尺寸二进制文件的语言.


此代码使用内置的print()函数,不推荐这种做法.问题不在于如何减少所提供的示例程序的代码大小,而是以更一般的方式.
请参阅http://doc.golang.org/ref/spec#Bootstrapping _这些函数是为了完整性而记录的,但不保证保留在language_中.对我来说,除了一次性调试之外,它在任何脚本中都意味着"不要使用它们".

7> 小智..:

创建一个名为的文件main.go,让我们尝试使用简单的hello world程序.

package main

import "fmt"

func main(){
    fmt.Println("Hello World!")
}

我使用版本1.9.1

$ go version
 go version go1.9.1 linux/amd64

使用标准go build命令编译.

$ go build main.go
$ ls -lh
-rwxr-xr-x-x 1 nil nil 1.8M Oct 27 07:47 main

让我们再次编译,go buildldflags如上所述,

$ go build -ldflags "-s -w" main.go
$ ls -lh
-rwxr-xr-x-x 1 nil nil 1.2M Oct 27 08:15 main

文件大小减少了30%.

现在,让我们用gccgo,

$ go version
 go version go1.8.1 gccgo (GCC) 7.2.0 linux/amd64

建筑物去gccgo,

$ go build main.go
$ ls -lh
-rwxr-xr-x 1 nil nil 34K Oct 27 12:18 main

二进制大小减少了近100%.让我们再次尝试建立我们main.gogccgo而是构建标志,

$ go build -gccgoflags "-s -w" main.go
-rwxr-xr-x 1 nil nil 23K Oct 27 13:02 main

警告: 作为gccgo二进制文件进行动态链接.如果你有一个非常大的二进制文件,那么用gccgo编译时你的二进制文件不会减少100%,但它的大小会减少相当大的数量.

与gc相比,gccgo编译代码的速度较慢,但​​支持更强大的优化,因此由gccgo构建的CPU绑定程序通常运行得更快.多年来在GCC中实现的所有优化都是可用的,包括内联,循环优化,向量化,指令调度等.虽然它并不总能产生更好的代码,但在某些情况下,使用gccgo编译的程序运行速度可提高30%.

预计GCC 7版本将包括Go 1.8用户库的完整实现.与早期版本一样,Go 1.8运行时未完全合并,但Go程序不应该看到它.

优点:

    缩小尺寸

    优化.

缺点

    无法使用最新版本go.

你可以在这里和这里看到.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有