golang的交叉编译问题(代码片段)

Baret-H Baret-H     2022-11-29     602

关键词:

参考: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交叉编译(代码片段)

golang的交叉编译要保证golang版本在1.5以上,本解决方案实例代码1.9版本执行的。GOOS=linuxGOARCH=amd64gobuildhello.go这里用到了两个变量:GOOS:目标操作系统GOARCH:目标操作系统的架构OSARCHOSVersionlinux386/amd64/arm>=Linux2.6darwin386/amd64OSX(Sn... 查看详情

golang如何交叉编译(代码片段)

Golang支持交叉编译,即在一个平台上生成另一个平台的可执行程序。方法如下:Mac下编译Linux和Windows64位可执行程序CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildmain.goCGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildmain.goLinux下编译Mac和Windows64位可执行程序C... 查看详情

golang对不同系统的编译(代码片段)

Golang支持在一个平台下生成另一个平台可执行程序的交叉编译功能。Mac下编译#mac编译linux执行文件CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildmain.go#mac编译windows执行文件CGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildmain.goLinux下编译#编译mac执行文件CGO_EN... 查看详情

golang交叉编译

Go在ver>=1.5的版本中,实现交叉编译如此简单一交叉编译依赖下面几个环境变量:$GOARCH  目标平台(编译后的目标平台)的处理器架构(386、amd64、arm)$GOOS     目标平台(编译后的目标平台)的操作系... 查看详情

golang打包,交叉编译,压缩

打包,压缩我们的常规打包方式$gobuild  Mac下我们用ls-lh查看,可以看到我们打包出来的可执行文件会比较大,一般只写几行代码就回又3M以上的文件大小了.我们的带压缩的打包方式$gobuild-ldflags‘-w-s‘  Mac下我们用ls-lh查看,可以... 查看详情

golang在windows与linux的部分区别(代码片段)

文章目录前言一、Golang为什么分不同的操作系统版本?二、包1.syscall2.runtime解决方案总结前言Golang语言包下载分为windows,linux和MAC,在平常的使用中并没有什么问题,但是在交叉编译场景的发生,却有不得不... 查看详情

使用cmake进行交叉编译(代码片段)

...果要应用这些cmake管理的项目到嵌入式环境中,必然涉及交叉编译的问题。这些项目交叉编译,主要是设置一些环境变量。这些设定可以写成一个.cmake文件,1)需要交叉编译时include,2)或者直接把这些配 查看详情

golang交叉编译笔记

GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)GOARCH:目标平台的体系架构(386、amd64、arm)Mac下编译Linux和Windows64位可执行程序CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildCGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildLinux下编译Mac和 查看详情

交叉编译出现提示pluginneededtohandleltoobject(代码片段)

文章目录shell环境下交叉编译输出使用此静态库时,输出未定义undefinedreferenceto使用nm查看静态库中的函数如何解决zynq平台下移植openamp,交叉编译出现pluginneededtohandleltoobject问题shell环境下交叉编译输出[94%]BuildingCobjectlib/CM... 查看详情

交叉编译链的安装(代码片段)

摘自:嵌入式交叉编译链的安装作者:一只青木呀发布时间:2020-08-0418:13:13网址:https://blog.csdn.net/weixin_45309916/article/details/107789879目录什么是交叉编译器交叉编译器的下载交叉编译器的安装1.把下载的文件放到Ubunt... 查看详情

关于openssl的交叉编译(代码片段)

...,可以使用./config或者./Configure来完成。网上也查了一些交叉编译的说明,经常在config之后,还要手动的修改makefile才行。这种就对我这种需要维护N种交叉编译环境的人来说,就比较头疼了。按常理讲,openssl这种用途如此广的开... 查看详情

arm交叉编译工具链(代码片段)

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。  免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是Codesour... 查看详情

golang交叉编译

Golang支持交叉编译,在一个平台上生成另一个平台的可执行程序。Mac下编译Linux和Windows64位可执行程序CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildmain.goCGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildmain.goLinux下编译Mac和Windows64位可... 查看详情

zlog库的交叉编译(代码片段)

1.编译环境 高通平台64位编译器:aarch64-oe-linux-gcc环境:ubuntu虚拟机2.下载zlog源码gitclonehttps://github.com/HardySimpson/zlog3.修改编译器拷贝编译器环境变量sdk.mk到src目录下包含环境变量文件4.编译生成库文件makeall  查看详情

zlog库的交叉编译(代码片段)

1.编译环境 高通平台64位编译器:aarch64-oe-linux-gcc环境:ubuntu虚拟机2.下载zlog源码gitclonehttps://github.com/HardySimpson/zlog3.修改编译器拷贝编译器环境变量sdk.mk到src目录下包含环境变量文件4.编译生成库文件makeall  查看详情

golang的学习(代码片段)

非0基础的Golang的学习Golang的优势极简单的部署方式可直接编译成机器码不依赖其他库直接运行可部署静态类型的语言编译时能检查出隐藏的大多数问题语言层面的并发天生支持充分利用多核强大的标准库runtime系统调度机制高效... 查看详情

buildroot构建交叉编译工具链(代码片段)

...般是binutils)和一个C标准库(例如GNULibc,uClibc-ng)组成。一个交叉编译工具链是可有在主机上运行的,但是编译出来的二进制文件只能运行在目标板或机器上。在我们的宿主机上也有工具链,它只能编译适用于我们的宿主机,编译 查看详情