Golang build 命令

go build

-o 可执行文件名【默认与目录同名,可指定到某个目录下面】
-a 强制重新编译的心脏病包(包括标准库)
-p 并行编译所使用的CPU核数
-v 显示待编译包名
-n 仅显示编译命令,但不执行
-x 显示正在执行的编译命令
-work 显示临时工作目录,完成后不删除
-race 启动数据竞争检查(仅支持 AMD64)
-gcflags 编译器参数
  -B 禁用越界检查
  -N 禁用优化
  -l 禁用内联
  -u 禁用 unsafe
  -S 输出汇编代码
  -m 输出优化信息
-ldflags 链接器参数
  -s 禁用符号表
  -w 禁用DRAWF调试信息
  -X 设置字符串全局变量值 【-X ver="0.99"】
  -H 设置可执行文件格式 【-H windowsgui】

更多命令参考:

go tool complie -h

go tool link -h

编译的更多选择

如果要使用 GDB 调试代码,最好添加 -gcflags "-N -l" 参数来限止优化与内联,否则调试器可能会"各种找不到 "的问题

问要部署上线的话,最好添加 -ldflags "-w -s" 会让链接器删除符号表与调试信息,可减小可执行文件的大小与反汇编的难度

upx 这个工具,可以更加压缩可执行文件的大小

upx -9 可执行文件

交叉编译

需要设置环境变量:GOOS 与 GOARCH

如:set GOOS=linux&& go build main.go

如:set GOOS=windows&& set GOARCH=386&& go build main.go

条件编译

方法1

在包的文件名中添加平台和架构信息,如下:

hello_linux.go
hello_darwin.go

编译命令:set GOOS=linux&& go build -x

编译的时候会自动使用 hello_darwin.go

方法2

// +build windows 编译指令

在每个源码文件的第一行添加此指定,会根据指令调用文件
多个build指令表示AND
单个build中空格表示 OR ,逗号表示 AND,感叹号表示 NOT

注意:此指令之后,必需空一行

例子:

// +build linux darwin
// +build 386,!cgo
# 解析: (linux OR darwin) AND (386 AND (NOT cgo))

参考源码: go/build 目录