我是靠谱客的博主 背后书本,最近开发中收集的这篇文章主要介绍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的交叉编译问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部