golang 交叉编译和ldflags

内容分享4小时前发布
0 0 0

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

© 版权声明

相关文章

暂无评论

none
暂无评论...