Golang 支持交叉编译, 在一个平台上生成另一个平台的可执行程序, 最近使用了一下, 超级好用, 这里备忘一下。
Mac 下编译 Linux 和 Windows 64位可执行程序
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Linux 下编译 Mac 和 Windows 64位可执行程序
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Windows 下编译 Mac 和 Linux 64位可执行程序
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go
GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
GOARCH:目标平台的体系架构(386、amd64、arm)
交叉编译不支持 CGO 所以要禁用它; 需要CGO支持的, 要将CGO_ENABLED的0改为1, 也就是CGO_ENABLED=1
上面的命令编译 64 位可执行程序, 你当然应该也会使用 386 编译 32 位可执行程序
许多博客都提到要先增加对其它平台的支持, 但是我跳过那一步, 上面所列的命令也都能成功, 且得到我想要的结果, 可见那一步应该是非必须的, 或是我所使用的 Go 版本已默认支持所有平台。
golang 编译程序从后台运行, 不出现 dos 窗口
go build -ldflags "-H windowsgui"
-ldflags 参数 go build在编译时用ldflags设置变量的值
> # mkdir bianyi
> # vim main.go
package main
import "fmt"
var (
VERSION string
BUILD_TIME string
GO_VERSION string
)
func main() {
fmt.Printf("%s
%s
%s
", VERSION, BUILD_TIME, GO_VERSION)
}
> # go mod init bianyi
> # go mod tidy
编译
> # go build -ldflags "-X main.VERSION=1.0.0 -X 'main.BUILD_TIME=`date`' -X 'main.GO_VERSION=`go version`'"
注意: 由于date和go version的输出有空格, 所以 main.BUILD_TIME 和 main.GO_VERSION 必须使用反引号括起来。
执行
> # ./bianyi
1.0.0
2022年 02月 14日 星期一 09:44:57 CST
go version go1.16.6 linux/amd64
直接运行:
> # go run -ldflags "-X main.VERSION=1.0.0 -X 'main.BUILD_TIME=`date`' -X 'main.GO_VERSION=`go version`'" main.go
1.0.0
2022年 02月 14日 星期一 10:01:11 CST
go version go1.16.6 linux/amd64
Golang 打包编译各个平台系统
Windows 系统
# 禁用 CGO
go env -w CGO_ENABLED=0
# 目标平台是 Windows
go env -w GOOS=windwos
# 目标处理器架构是 amd64(64 位操作系统)
go env -w GOARCH=amd64
Linux 系统
# 禁用 CGO
go env -w CGO_ENABLED=0
# 目标平台是 Linux
go env -w GOOS=linux
# 目标处理器架构是 amd64(64 位操作系统)
go env -w GOARCH=amd64
Mac 系统
# 禁用 CGO
go env -w CGO_ENABLED=0
# 目标平台是 Mac
go env -w GOOS=drawin
# 目标处理器架构是 amd64(64 位操作系统)
go env -w GOARCH=amd64





