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 目录