go build 交叉编译

作者:matrix 发布时间:2023年2月10日 分类:Golang

Golang支持跨平台编译,比起python只能编译为当前平台的二进制文件要好太多。

go build help

$ go help  build
usage: go build [-o output] [build flags] [packages]
...

默认编译(输出当前平台二进制文件)

$ go build -ldflags="-s -w"  main.go && upx -9 ./main

说明:
upx 该工具用于压缩二进制文件 -9 表示最高压缩率(选择范围为1-9)

跨平台编译

Mac/Linux系统下:

输出Linux可执行文件:

$ CGO_ENABLE=0 GOOS=linux GOARCH=amd64 go build -ldflags='-s -w -extldflags "-static -fpic"' -o main-linux-amd64  main.go  && upx -9 ./main-linux-amd64

输出Windows可执行文件:

$ CGO_ENABLE=0 GOOS=windows GOARCH=amd64 go build -ldflags='-s -w -extldflags "-static -fpic"' -o main-windows-amd64.exe  main.go  && upx -9 ./main-windows-amd64.exe

输出Mac可执行文件:

# Intel
$ CGO_ENABLE=0 GOOS=darwin GOARCH=amd64 go build -ldflags='-s -w -extldflags "-static -fpic"' -o main-darwin-amd64  main.go  && upx -9 ./main-darwin-amd64

# Apple Silicon (M1)
$ CGO_ENABLE=0 GOOS=darwin GOARCH=arm64 go build -ldflags='-s -w -extldflags "-static -fpic"' -o main-darwin-arm64 main.go  && upx -9 ./main-darwin-arm64

windows系统下:

SET CGO_ENABLE=0
SET GOOS=linux 
SET GOARCH=amd64
go build -ldflags='-s -w -extldflags "-static -fpic"'  main.go

参数说明

CGO_ENABLE 是否开启CGO。默认为1开启CGO(不支持交叉编译),0表示关闭CGO
GOARCH 表示CPU架构amd64(x86-64 普通家用电脑)、ARM
GOOS 表示操作系统Linux、Windows、Darwin(Mac)
-o 表示输出指定文件名(默认为main)
-a 表示强制重新构建

-ldflags参数
`-s -w` 表示减小体积,去除编译携带的符号表和调试信息
-s 忽略符号表和调试信息
-w 忽略DWARFv3调试信息,将无法使用gdb进行调试

-extldflags "-static -fpic" 表示完全静态编译(默认是静态链接 个别库可能会导致动态链接),这样编译生成的文件就可以任意放到指定平台下运行,不需要运行环境的基础依赖库()

二进制压缩工具upx(可选)

Mac下使用brew安装

$ brew install upx
$ upx --version 
upx 3.96

其他平台:
https://github.com/upx/upx/releases

upx压缩工具能省掉40%-70%的大小

-rwxr-xr-x   1 hhtjim  staff   7.9M Feb  9 00:13 main-default
-rwxr-xr-x   1 hhtjim  staff   5.5M Feb  9 00:15 main-ldflags
-rwxr-xr-x   1 hhtjim  staff   2.3M Feb  9 00:34 main-upx

参考:

https://mp.weixin.qq.com/s/hx9Vbdes6cmRNMiUNqOTCQ

https://mp.weixin.qq.com/s/s6QzFkT1YU3lwkuZSHNb-A

https://dev.to/tidalcloud/how-to-cross-compile-go-app-for-apple-silicon-m1-27l6

https://docs.studygolang.com/pkg/runtime/internal/sys/#pkg-constants

https://zhuanlan.zhihu.com/p/338891206

完全静态编译一个Go程序
https://colobu.com/2018/07/20/totally-static-Go-builds/

Go编译常用参数
https://juejin.cn/post/7096772208999006244