golang 的编译没有 debug release 之分吗?

2019-05-07 01:06:54 +08:00
 51300520

写了这么久的 go,突然想到这个问题,它为啥不像 c++这种有 debug 和 release? 它那个默认编译是直接 release 版本?

7302 次点击
所在节点    问与答
12 条回复
coderluan
2019-05-07 01:23:41 +08:00
debug 和 release 其实只是编译器预设的常用编译选项组合,和语言本身没关系的。
c++用 gcc 也是没 debug 和 release 的,但是有-d,-o2 之类的选项,你可以自己组合出 debug 和 release 一样的效果。
所以 go 也是一回事,具体看你用什么编译器,即使编译器没有 debug 和 release,你也是可以自己改编译选项的。
yanaraika
2019-05-07 02:04:30 +08:00
默认是 RelWithDebugInfo
Cu635
2019-05-07 02:52:00 +08:00
@coderluan
……
对于 c/c++来说,debug 出来的二进制文件是内嵌源代码的,编译选项就是 gcc -g,直接用 hexdump -C 就能看到。当然还有其它调试用的信息,包括内嵌源代码这些调试信息这个才是根本差别,也是要用编译器的编译选项开关来控制的
vindurriel
2019-05-07 04:36:20 +08:00
有的 去掉 debug 信息能瘦身 15% 参见 go build 说明文档
mason961125
2019-05-07 07:45:39 +08:00
strip 了解一下?
gamexg
2019-05-07 08:49:34 +08:00
默认带符号链接,对外发布可以去掉。
另外默认未开启内存竟态检查,调试版本可以开启。
flynaj
2019-05-07 09:04:56 +08:00
默认参数是 debug 版,加编译参数-ldflags "-w -s"才是 release. -w 为去掉调试信息,-s 为去掉符号表,文件大小会减小。
coderluan
2019-05-07 12:38:43 +08:00
@Cu635

根本差别应该是两个,一个是你说的调试信息,另一个是代码优化,-o1 -o2 这些,这些开关直接影响程序生成的性能的,也就是 release 比 debug 快的原因,非常重要。
sujin190
2019-05-07 14:52:32 +08:00
@coderluan #8 go 的文档没有特别强调,那估计是生成的代码是一样的,没有特别优化,而且编译号运行和 go run 直接运行似乎看不出性能差距,感觉应该是一样的
coderluan
2019-05-07 15:09:21 +08:00
@sujin190 go 确实没有,8 楼是回复 3 楼“对于 c/c++来说”的内容。
Cu635
2019-05-08 16:04:22 +08:00
@coderluan
代码优化不是根本差别,那是锦上添花。很重要没错。调试信息才是根本。
coderluan
2019-05-09 10:43:10 +08:00
@Cu635 这个我完全不认同,C/C++主要应用领域就是性能相关的领域,release (-ox )的性能比 debug 的性能提升非常非常明显,所有的官方发布的版本一定会带-ox,所以他叫 release,而不是 nodebug.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/561636

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX