参考:Golang交叉编译各个平台的二进制文件 - Go语言中文网 - Golang中文社区 (studygolang.com)、也谈Go的可移植性 | Tony Bai
今天准备将一个在Mac上开发的Golang项目部署到云服务器上进行部署上线,于是通过go build将项目编译成mac下的Unix可执行二进制文件上传到了CentOS云服务器准备运行,但此时报了一个错:
-bash: ./Technology-Learning-Community: cannot execute binary file
经过查询,导致这种情况的原因一般有两种:
- 一是缺少执行权限,于是我尝试通过sudo执行和chmod +x来增加权限,但是仍然无法解决。
- 二是编译环境的不同,mac下二进制文件与linux下是不兼容的,经过问题的不断查询,了解到Golang交叉编译的概念。
所谓交叉编译,就是在一个平台上生成另一个平台的可执行程序,这也就是Golang能够实现可移植性的原因之一。我们在go build前设置编译的参数即可方便的生成其他平台的二进制文件:
# mac上编译linux和windows二进制
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二进制
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二进制
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
其中用到的三个变量就是go env中的配置参数,我们可以通过go help environment
查看参数的详细含义:
-
CGO_ENABLED
:是否开启CGO,CGO即在Go代码中调用C代码交叉编译,但是交叉编译是不支持CGO的,也就是说如果你的代码中存在C代码,是编译不了的,所以需要禁用它Whether the cgo command is supported,Either 0 or 1
-
GOOS
:指定目标平台的操作系统The operating system for which to compile code,Examples are linux, darwin, windows, netbsd
-
GOARCH
:执行目标平台的操作系统架构The architecture, or processor, for which to compile code,Examples are amd64, 386, arm, ppc64.