参考: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的交叉编译问题相关推荐

  1. golang 的交叉编译

    为什么80%的码农都做不了架构师?>>>    Go是一门编译型语言,所以在不同平台上,需要编译生成不同格式的二进制包. 由于Go 1.5对跨平台编译有了一些改进,包括统一了编译器. ...

  2. golang交叉编译工具,gox使用入门

    gox入门教程 先说下交叉编译是什么?  交叉编译也就是你可以在linux上编译出可以在windows上运行的程序,在32位系统编译出64位系统运行的程序. gox就是方便你使用golang的交叉编译 ...

  3. 交叉编译_Golang交叉编译

    Golang支持交叉编译,可以在一个操作系统生成另一个操作系统的可执行二进制文件. Mac下编译 Linux 和 Windows 64位可执行程序: CGO_ENABLED=0 GOOS=linux ...

  4. 深入理解Golang包导入

    Golang使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显 ...

  5. go如何进行交叉编译

    go如何进行交叉编译 2018-02-16 文章目录 golang交叉编译 问题 golang如何在一个平台编译另外一个平台可以执行的文件.比如在mac上编译Windows和linux可以执行的文件. ...

  6. Golang的演化历程

    http://blog.csdn.net/anlun/article/details/41494391 Golang的演化历程 十 25 本文来自Google的Golang语言设计者之一Rob Pik ...

  7. golang环境 centos 7

    https://blog.csdn.net/ggq89/article/details/82682171  Linux下Go的安装.配置 .升级和卸载 https://blog.csdn.net/we ...

  8. Go 语言编程 — Overview

    目录 文章目录 目录 缘起 我们为什么选择 Golang? Golang 是云时代的宠儿! Golang 的吉祥物 Golang 的特性 语法简单 原生支持并发编程 内存分配 自动垃圾回收 使用静态链 ...

  9. go socket编程(详细)

    Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均 ...

最新文章

  1. MYSQL 连接数据库命令收藏
  2. 我竟然被“双亲委派”给虐了
  3. 如何从 SAP Fiori Elements List Report Table 点击事件响应函数里拿到表格某一行的信息
  4. php进度条如何计算,投票最后显示进度条的百分比怎么算
  5. matlab中文帮助_拿走不谢,simulink,stateflow,ecoder帮助手册中英对照版首发
  6. 【AI】(收藏)从 A-Z 全面盘点人工智能专业术语梳理!
  7. java api 获取jvm实例_JVMTI那些事——和Java相互调用
  8. 有哪些函数可以反截图、_视频微课:征服反三角函数——反三角函数核心思想与方法——“1个概念”、“2类关系”、“3个层次”...
  9. 无人机群编队分析的定位问题 分析与思考-1(数学建模竞赛2022年B题)
  10. EDI 电子数据交换(Electronic data interchange,缩写EDI)
  11. 家庭宽带光猫改桥接模式教程-淇云博客
  12. 通过Java实现一个企业人事管理系统
  13. uniapp——点击图片放大预览
  14. LED点阵屏动画展示
  15. Ubuntu 各版本代号简介
  16. ps命令查看进程详解
  17. jaccard相似度算法
  18. 微信小程序仿网易云音乐(使用云开发,提供源码)
  19. 计算机网络专用术语基本概念
  20. 【ASML】EUV光刻技术PPT

热门文章

  1. Linux shell 学习笔记(2)— 监测程序、磁盘空间和处理文件(ps -ef、top、kill、df、du 、grep、tar)
  2. 发现服务内存中free部分很小,available部分很大,应该怎么办
  3. Kali2021.2 VMware最新版安装步骤
  4. 【课堂笔记系列】二进制
  5. LeetCode简单题之检查某单词是否等于两单词之和
  6. LLVM Clang前端编译与调试
  7. 国民技术芯片相关产业研发
  8. OpenCL™(开放计算语言)概述
  9. MindSpore应用目标
  10. 常用语义分割小样本模型