go程序在mac下的交叉编译
主页
- 微信公众号:密码应用技术实战
- 博客园首页:https://www.cnblogs.com/informatics/
背景
go语言的一大优势就是跨平台,go语言是编译型语言,与Java、C#等语言的跨平台不同的是:
- go语言的跨平台不依赖于
虚拟机 - 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下的交叉编译的更多相关文章
- iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA
原文在此 一.Reveal 1 一般使用 Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局.如下图所示: Reveal是需要付费的,需要89美元, ...
- Mac下运行ASP.NET Core应用程序
Mac下运行ASP.NET Core应用程序 在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的 ...
- Mac下新安装的MySQL无法登陆root用户解决方法
一 设置MySQL命令行搜索路径 0.苹果->系统偏好设置->最下边点mysql 在弹出页面中 启动mysql服务 1.打开终端,输入: sudo vi ~/.bash_profile ...
- 在Mac下运行ASP.NET Core应用程序
在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的第一个ASP.NET应用. 开发环境搭建 首先 ...
- Mac下用g++编译opencv程序报错
问题描述: 在Mac下安装好opencv, 安装: bash brew install opencv 写了一个opencv程序: ``` C++ //作用就是:取视频的每一帧, ...
- .NET Core初体验 - 在Mac下运行第一个Web示例程序
要说最近两天程序猿之间最喜欢吹水的事是什么?那绝壁是甲骨文要放弃Java!简直做梦都要笑醒!由于公司的产品线全面转向Java,最近几个月也一直在苦学Java技术.已经默默决定了,如果消息证实是真的,我 ...
- Golang 在 Mac、Linux、Windows 下如何交叉编译(转)
原文地址:Golang 在 Mac.Linux.Windows 下如何交叉编译 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下 ...
- MAC 下用 Common Lisp 调试 OpenGL 程序
MAC 下用 Common Lisp 调试 OpenGL 程序 环境搭建 运行环境: OSX 10.11.3 EI Capitan Common Lisp: SBCL 使用 SBCL, 首先要安装这几 ...
- Mac下将C程序创建为动态链接库再由另一个C程序调用
写C的时候需要调用之前的一个C程序,想用动态链接库的方式.Mac下的动态链接库是dylib,与Linux下的.os或Windows下的.dll不同.由于之前没有接触过,所以翻了大量的博客,然而在编译过 ...
- Golang 在 Mac、Linux、Windows 下如何交叉编译
转自 https://blog.csdn.net/panshiqu/article/details/53788067 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下 ...
随机推荐
- 知识蒸馏相关技术【模型蒸馏、数据蒸馏】以ERNIE-Tiny为例
1.任务简介 基于ERNIE预训练模型效果上达到业界领先,但是由于模型比较大,预测性能可能无法满足上线需求. 直接使用ERNIE-Tiny系列轻量模型fine-tune,效果可能不够理想.如果采用数据 ...
- Prompt learning 教学[案例篇]:文生文案例设定汇总,你可以扮演任意角色进行专业分析
Prompt learning 教学[案例篇]:文生文案例设定汇总,你可以扮演任意角色进行专业分析 1.角色扮演 行为 Prompt写法 "牙医" ""我想让你 ...
- LyScript 寻找ROP漏洞指令片段
ROP绕过片段简单科普一下,你可以理解成一个可以关闭系统自身内存保护的一段机器指令,这段代码需要我们自己构造,这就涉及到在对端内存搜寻这样的指令,LyScript插件增强了指令片段的查找功能,但需要我 ...
- tomcat各版本与jdk及servlet各版本对应关系
在项目部署的时候,如果对于Web应用没有选择正确的Web服务器版本,应用可能不能正常运行.下图为官方给的Servlet/JSP各规范与Web服务器Tomcat各版本的对应关系,如:支持Servlet ...
- PCIe诞生20年来最大变革!引入光学传输
PCI-SIG组织官方宣布,已经成立新的光学工作组(Optical Workgroup),研究为PCIe规范引入光学传输接口的可能性. PCIe标准是Intel 2001年提出的,2003年发布1.0 ...
- Docker从认识到实践再到底层原理(八)|Docker网络
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...
- 【可观测性系列】 Opentelemetry 介绍
作者简介:大家好,我是蓝胖子 ️博客首页:博客园主页蓝胖子的编程梦 每日一句:人生的烦恼,多在于明白的太多,而做的太少 大家好,我是蓝胖子,随着微服务的流行,服务的可观测性概念被越来越多人提及到,究竟 ...
- CentOS7.5上Oracle19c离线rpm安装
CentOS7.5上Oracle19c离线rpm安装 一.基础环境配置及依赖安装(1)关闭系统防火墙(如外网环境不能关闭防火墙自行开放相关需要使用的端口即可) systemctl stop firew ...
- [Java]ArrayList源码解析
ArrayList源码解析 1. 核心源码解读 package java.util; import java.util.function.Consumer; import java.util.func ...
- NC14522 珂朵莉的数列
题目链接 题目 题目描述 珂朵莉给了你一个序列,有 \(\frac{n\times(n+1)}2\) 个子区间,求出她们各自的逆序对个数,然后加起来输出 输入描述 第一行一个数 n 表示这个序列 a ...