背景

最近有个小伙伴离职了,他的项目交接给我了,项目里使用了 Go 的 wire 库进行编译时依赖注入,那就要装 wire 库咯。

原本想的直接使用 go get github.com/google/wire/cmd/wire 就可以在 GOPATH/bin 下生成 wire.exe 就可以了,结果被墙了,在 golang.org/x/tools 下载上欲仙欲死,我自己去 github 上把 /x/tools 手动下载下来都没用,开了 VPN 也没用,就去 github 上把 wire 源码 git 下来了,附 wire Github 地址,准备在本地编译,结果编译出来的 wire.exe 一运行 wire 命令 就报 此文件的版本与正在运行的 windows 版本不兼容,请联系开发者。编译的各种参数都没问题,就是不成功,吐血。

因为 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序。就想换个思维,在 Linux 上编译 Windows 的版本,复制到 GOPATH/bin 下使用。

交叉编译

Mac下编译

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下编译

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下编译

Windows 下编译 Mac 和 Linux 可执行程序

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 所以要禁用它

上面的命令编译 64 位可执行程序,你当然应该也会使用 386 编译 32 位可执行程序

验证

把 Linux 上生成好的 wire.exe 下载复制到我本地 GOPATH/bin 目录下,进入项目,在根目录删除掉原来的 wire_gen.go 文件,执行 wire 命令,重新生成了 wire_gen.go 文件,项目运行正常,大功告成!

最后修改:2023 年 09 月 11 日
如果觉得我的文章对你有用,请随意赞赏