Go Build Flags
目录
警告
本文最后更新于 2021-01-13,文中内容可能已过时。
ldflags
ldflags用于将标志传递给编译器链接器(ld)。
- -s: 去掉符号表信息,减小可执行文件的大小。
- -w: 去掉DWARF调试信息,减小可执行文件的大小。
- -X: 设置字符串变量,用于编译时注入程序版本等信息。例如,-X main.version=1.0.0
- -H: 设置堆的大小。例如,-H=0 表示禁用堆。
- -extldflags: 用于将标志传递给链接器。
在构建时设置一个环境变量
一个非常方便的构建标志,允许你在构建时从命令行设置一个变量。看下面的例子。
|
|
使用默认值我们得到以下结果。
|
|
通过添加-X
链接器标志,我们可以在编译时改变who
。这只是一个愚蠢的例子,但这对于在编译时更新二进制文件的版本信息很有用。
|
|
symbol table
可以使用go tool nm
命令查看。只需将可执行文件、对象文件或存档的名称传递给它。让你自己更轻松,只需在输出中寻找你的变量即可。
|
|
缩小你的Go二进制
go的版本为1.15.6
,有原来的2M
压缩成了1.4M
。
我们可以用以下标志省略symbol table
、调试信息和DWARF表。可以用以下标志省略: -s -w
|
|
最好的可执行文件打包器之一是UPX。它使用起来非常简单。我用-9
运行它,以速度为代价获得最大的压缩。
|
|
没有控制台窗口的Windows可执行文件
我觉得当我运行一个exe时,打开一个控制台窗口很不美观,而且我不需要看到任何输出。
只要在你的链接器标志中添加"-H=windowsgui"
。控制台窗口消失了。欢迎你。
|
|
gcflags
- -N: 禁用优化。使用这个标记编译程序时,将禁用所有优化,这对于调试程序非常有用。
- -l: 关闭内联编译器。通过这种方式可以控制内联编译器的行为,但是要注意关闭内联编译器可能会导致性能问题。
- -m: 打印内存分配的信息,包括在哪里发生了内存分配以及分配的类型。
- -B: 设置最大的过程编译器的字节数。
- -S: 将汇编代码打印到标准输出中。这对于调试优化程序非常有用,可以让开发人员更好地理解程序中发生了什么。
|
|
使用案例
go build -gcflags="-N -l"
: 禁止优化,禁止内联go build -gcflags="-m -l"
: 观察内存逃逸