主页

背景

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. 为游戏接入ios sdk的oc学习笔记

    开发手机游戏,需要接入ios的sdk,截止2021年7月23日虽然swift已经推出一些年头,但对于大部分的渠道sdk,还是oc的代码. oc不仅仅用来开发ios,还是mac上的app开发语言 从新手 ...

  2. 从零开始配置vim(28)——代码的编译、运行与调试

    在前面几个章节,我们逐渐为 Vim 配置了语法高亮.代码的跳转和自动补全功能.现在的 Vim 已经可以作为代码编辑器来使用了.但是想将它作为日常发开的主力编辑器来用还需要很长一段路要走,其中一个就是要 ...

  3. 【主流技术】聊一聊对 Mybatis Plus 的理解与应用

    前言 mybatis plus是一个mybatis的增强工具,在其基础上只做增强不做改变.作为开发中常见的第三方组件,学习并应用在项目中可以节省开发时间,提高开发效率. 官方文档地址:MyBatis- ...

  4. 7.4 Windows驱动开发:内核运用LoadImage屏蔽驱动

    在笔者上一篇文章<内核监视LoadImage映像回调>中LyShark简单介绍了如何通过PsSetLoadImageNotifyRoutine函数注册回调来监视驱动模块的加载,注意我这里用 ...

  5. 4.1 C/C++ 使用结构与指针

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  6. Python Selenium 库使用技巧

    Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE,Mozilla Firefox,Safari,Google ...

  7. 纪念JDBC

    技术总是在不断更新变化的,尤其是在IT编程领域. 有时候我们理所当然的用着现成的框架,以至于用的太过于顺手,更要时不时的骂一句: 什么垃圾框架?我家狗都不会用! 如果那些被拍死在沙滩的"前浪 ...

  8. 3.4 CSP-J 补赛游寄

    3.4 CSP-J 补赛游寄 Day -? 听说要去打比赛. Day -7 今天家长会,老师公布成绩 /fn/fn/fn.政治考废了,然后其他都挺好. 语文 $ 95 $,数学 $ 118 $,英语 ...

  9. C# 二十年语法变迁之 C# 8参考

    C# 二十年语法变迁之 C# 8参考 自从 C# 于 2000 年推出以来,该语言的规模已经大大增加,我不确定任何人是否有可能在任何时候都对每一种语言特性都有深入的了解.因此,我想写一系列快速参考文章 ...

  10. 从零开始的react入门教程(二),从react组件说到props/state的联系与区别

    壹 ❀ 引 在从零开始的react入门教程(一)一文中,我们搭建了第一个属于自己的react应用,并简单学习了jsx语法.jsx写法上与dom标签高度一致,当然我们也知道,本质上这些react元素都是 ...