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
分类:
golang学习之路
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?