主页

背景

go语言的一大优势就是跨平台,go语言是编译型语言,与Java、C#等语言的跨平台不同的是:

  1. go语言的跨平台不依赖于虚拟机
  2. go语言的跨平台需要在对应系统上进行编译才能完成。

目前go语言在web网站建设、云原生以及系统软件领域已经占有了一席之地。go软件工程师在日常开发中大多基于MacOS平台,而软件最终大多需要在Linux上进行部署,这就可能带来以下问题:

  • 需要将go代码copy到Linux主机上进行编译
  • Linux作为服务器,可能无法访问外网,因此go代码依赖的第三方库可能无法下载

基于以上两个问题,最好的解决方案就是交叉编译。交叉编译指的是,在开发机(如MacOS平台)上编译出能在部署机(Linux平台)

go交叉编译

需要注意的是,如果自己的go项目代码使用了cgo,则需要使用交叉编译器,如: xx-linux-gun-gcc用于在mac下对linux平台进行交叉编译

不依赖cgo

# 1. 交叉编译为 Linux 64 位可执行文件:
GOOS=linux GOARCH=amd64 go build -o myapp-linux64 # 2. 交叉编译为 Windows 64 位可执行文件:
GOOS=windows GOARCH=amd64 go build -o myapp.exe # 3. 交叉编译为 macOS 64 位可执行文件(自身平台):
GOOS=darwin GOARCH=amd64 go build -o myapp-macos
# 以上编译等价于(本地编译)
go build -o myapp-macos # 4. 交叉编译为 ARM 架构(例如 Raspberry Pi,国产信创环境):
GOOS=linux GOARCH=arm go build -o myapp-arm

依赖于cgo

依赖于cgo的go项目,在编译时,一般需要使用交叉编译工具,交叉编译工具下载

https://github.com/messense/homebrew-macos-cross-toolchains/releases

我们这里以Mac平台,交叉编译linux x86-64平台为例,这里需要下载的交叉编译工具是:x86_64-unknown-linux-gnu-x86_64-darwin.tar.gz

交叉编译工具:

# 解压压缩包
➜ tar -zxvf x86_64-unknown-linux-gnu-x86_64-darwin.tar.gz /opt/
➜ ls -al /opt/x86_64-unknown-linux-gnu
drwxr-xr-x@ 39 hxy staff 1.2K Aug 31 11:01 bin
-rw-r--r--@ 1 hxy staff 2.5M Aug 31 11:01 build.log.bz2
drwxr-xr-x@ 2 hxy staff 64B Aug 31 11:01 include
drwxr-xr-x@ 6 hxy staff 192B Aug 31 11:01 lib
drwxr-xr-x@ 3 hxy staff 96B Aug 31 11:01 libexec
drwxr-xr-x@ 6 hxy staff 192B Aug 31 11:01 share
drwxr-xr-x@ 9 hxy staff 288B Aug 31 11:01 x86_64-unknown-linux-gnu

go程序交叉编译:

# 在go项目main包中,执行以下命令,编译项目可执行程序myapp-linux64
# 其中:CGO_ENABLED=1表示使用了cgo,CC指定了交叉编译器x86_64-unknown-linux-gnu-gcc
CGO_ENABLED=1 CC=/opt/x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-gcc \
GOOS=linux GOARCH=amd64 go build -o myapp-linux64 # 其他平台类似,只需要修改CC交叉编译器即可,这里不在赘述

总结

本文介绍了golang在使用cgo和不使用cgo情况下的交叉编译流程,以及使用的交叉编译工具。 出了交叉编译可以解决跨平台编译的问题外,使用docker容器进行编译也是一个不错的选择。如在本文交叉编译例子中,可以 使用支持linux环境的docker容器,并挂载本地go项目代码,进行编译;编译成功后可以将编译得到的二进制copy到本地。

参考资料

交叉编译工具:https://github.com/messense/homebrew-macos-cross-toolchains/releases

go程序在mac下的交叉编译的更多相关文章

  1. iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA

    原文在此 一.Reveal 1 一般使用     Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局.如下图所示:     Reveal是需要付费的,需要89美元, ...

  2. Mac下运行ASP.NET Core应用程序

    Mac下运行ASP.NET Core应用程序 在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的 ...

  3. Mac下新安装的MySQL无法登陆root用户解决方法

      一 设置MySQL命令行搜索路径 0.苹果->系统偏好设置->最下边点mysql 在弹出页面中 启动mysql服务 1.打开终端,输入: sudo vi ~/.bash_profile ...

  4. 在Mac下运行ASP.NET Core应用程序

    在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的第一个ASP.NET应用. 开发环境搭建 首先 ...

  5. Mac下用g++编译opencv程序报错

    问题描述: 在Mac下安装好opencv, 安装:    bash  brew install opencv      写了一个opencv程序:    ``` C++ //作用就是:取视频的每一帧, ...

  6. .NET Core初体验 - 在Mac下运行第一个Web示例程序

    要说最近两天程序猿之间最喜欢吹水的事是什么?那绝壁是甲骨文要放弃Java!简直做梦都要笑醒!由于公司的产品线全面转向Java,最近几个月也一直在苦学Java技术.已经默默决定了,如果消息证实是真的,我 ...

  7. Golang 在 Mac、Linux、Windows 下如何交叉编译(转)

    原文地址:Golang 在 Mac.Linux.Windows 下如何交叉编译 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下 ...

  8. MAC 下用 Common Lisp 调试 OpenGL 程序

    MAC 下用 Common Lisp 调试 OpenGL 程序 环境搭建 运行环境: OSX 10.11.3 EI Capitan Common Lisp: SBCL 使用 SBCL, 首先要安装这几 ...

  9. Mac下将C程序创建为动态链接库再由另一个C程序调用

    写C的时候需要调用之前的一个C程序,想用动态链接库的方式.Mac下的动态链接库是dylib,与Linux下的.os或Windows下的.dll不同.由于之前没有接触过,所以翻了大量的博客,然而在编译过 ...

  10. Golang 在 Mac、Linux、Windows 下如何交叉编译

    转自 https://blog.csdn.net/panshiqu/article/details/53788067 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下 ...

随机推荐

  1. 强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0

    强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0 1.定义算法 相比于Q learning,DQN本质上是为了适应更为复杂的环境,并且经过不断的改良迭代,到 ...

  2. C++ STL 标准模板库(排序/集合/适配器)算法

    C++ 标准模板库STL,是一个使用模板技术实现的通用程序库,该库由容器container,算法algorithm,迭代器iterator,容器和算法之间通过迭代器进行无缝连接,其中所包含的数据结构都 ...

  3. 随机 Transformer

    在这篇博客中,我们将通过一个端到端的示例来讲解 Transformer 模型中的数学原理.我们的目标是对模型的工作原理有一个良好的理解.为了使内容易于理解,我们会进行大量简化.我们将减少模型的维度,以 ...

  4. 并发编程-JUC的三个常用工具类

    1.CountDownLatch:减法计数器 代码实例 public class CountDownLatchTest { public static void main(String[] args) ...

  5. Python中os.walk函数说明

    这个函数对于文件方面的遍历等其他方面的操作来说功能很强大,比如批量修改文件名.批量移动文件.将所有不在一个文件夹下的文件移动到同一个文件夹下等等. 这个其实很简单的,用一个示例就能明白这个函数的具体用 ...

  6. DBGrideh使用小结【EditorMode】当用户点击单元格的时候,自动进入编辑状态

    (1)控制一个单元格是否允许编辑(或者说文字选中),可以设置Grid的Options的dgEditing属性:如果该属性为False,那么用户只能选中该单元格而无法选中里面的内容,也无法进行编辑.(2 ...

  7. Visual Studio部署matplotlib绘图库的C++版本

      本文介绍在Visual Studio软件中配置.编译C++环境下matplotlibcpp库的详细方法.   matplotlibcpp库是一个C++环境下的绘图工具,其通过调用Python接口, ...

  8. 【Unity3D】人机交互Input

    1 前言 ​ Input 是 Unity3D 中用于人机交互的工具类,用户可以调用其 GetKey.GetMousePosition.GetMouseButton.GetAxis.GetButton ...

  9. Js中Proxy对象

    Js中Proxy对象 Proxy对象用于定义基本操作的自定义行为,例如属性查找.赋值.枚举.函数调用等. 语法 const proxy = new Proxy(target, handler); ta ...

  10. Object.definePropety

    defineProperty Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象,也就是说,该方法允许精确地添加或修改对象的属 ...