golang 编译后文件变小的方法

polaris · · 13281 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
总有人说Go程序“好大”,一个Hello World都1M多。其实,随着程序源码越来越大,编译后的文件并非那么快速的增长,这点大小真心没必要那么在乎,又不是软盘时代。但总有一些人非得想要小点。 首先我们看一下为什么会比其他语言大些: Go 编译的可执行文件都包含了一个运行时(runtime),和我们习惯的Java/.NET VM有些类似。 运行时负责内存分配(Stack Handing、GC Heap)、垃圾回收(Garbage Collection)、Goroutine调度(Schedule)、引用类型(slice、map、channel)管理,以及反射(Reflection)等工作。Go程序进程启动后会自动创建两个goroutine,分别用于执行main入口函数和GC Heap管理。 也正是因为编译文件中嵌入了运行时,使得其可执行文件相较其他语言更大一些。但Go的二进制可执行文件都是静态编译的,无需其他任何链接库等文件,更利于分发。 我们可以通过下面的方法将其变小点: 采用:`go build -ldflags "-s -w"` 这种方式编译。 解释一下参数的意思: - -ldflags: 表示将后面的参数传给连接器(5/6/8l) - -s:去掉符号信息 - -w:去掉DWARF调试信息 注意: -s 去掉符号表(这样panic时,stack trace就没有任何文件名/行号信息了,这等价于普通C/C+=程序被strip的效果) -w 去掉DWARF调试信息,得到的程序就不能用gdb调试了 两个可以分开使用 实际项目中不建议做这些处理,没啥必要。
13281 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传