Golang的交叉编译问题

Posted Baret-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang的交叉编译问题相关的知识,希望对你有一定的参考价值。

参考: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.

以上是关于Golang的交叉编译问题的主要内容,如果未能解决你的问题,请参考以下文章

Golang 在 MacLinuxWindows 下交叉编译

Golang的交叉编译问题

Golang 交叉编译

Golang 交叉编译

Golang 如何交叉编译

Golang的交叉编译问题