主页

背景

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. Python中局部放大图案例

    例子一: 先上完整代码和效果图: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.ins ...

  2. 【1】VScode 中文界面方法-------超简单教程

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  3. 【2】VScode 搭建python和tensorflow环境

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  4. [XXL-JOB] 分布式调度XXL-JOB快速上手

    1.概述 1.1什么是任务调度 我们可以思考一下下面业务场景的解决方案: 某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系 ...

  5. 理论与实战:一篇看懂Python词云

    理论与实战:一篇看懂Python词云 后宫王镇贴 前言:本文初编辑于2024年2月2日 该项目代码的仓库地址:https://github.com/A-Piece-Of-Maple/WordCloud ...

  6. Web入门:JavaScript文字动画

    欢迎来的我的小院,恭喜你今天又要涨知识了! 案例内容 利用JavaScript实现文字逐步展现的动画效果. 演示 学习 <!DOCTYPE html> <html lang=&quo ...

  7. Delphi原子操作函数介绍

    一.Delphi的原子操作函数 在System.SyncObjs单元中,有一个TInterlocked的密封类,其十多个类函数(class function)其实都是调用的System单元的原子操作函 ...

  8. Windows10系统下JDK1.8的下载安装及环境变量配置

    1. JDK1.8安装 2. 环境变量配置点击此处:官网下载 根据自己的系统 ,下载相应的JDK版本. 1. JDK1.8安装双击下载的安装包(.exe文件),进行安装. 点击"下一步&qu ...

  9. [JVM] CPU缓存一致性协议

    CPU缓存一致性协议 CPU高速缓存 CPU缓存是位于cpu和内存之间的临时数据交换器,它的容量比内存小的夺但是交换速度要比内存快得多,主要是为了解决cpu运行时的处理速度与内存读写速度不匹配的问题. ...

  10. CF1907

    A 模拟. B 模拟. C 若原字符串中出现次数最多的次数为 \(cnt\),答案是 \(\max(n\%2,cnt\times 2-n)\). D 二分 \(k\),然后从后往前倒,计算出到达每个线 ...