Windows golang cgo交叉编译 linux arm64

21 篇文章 0 订阅

在Windows上编译Linux Arm64 架构的go程序,最简单的方式是使用 WSL (Windows的linux子系统)

目标是在 Windows 编译ARM64的含有Cgo的 Golang程序。

环境安装

安装 WSL

在控制面板找到 程序 然后 选择 启用或关闭 Windows功能

找到 适用于Linux的Windows子系统 勾选,然后确定,根据提示完成系统重启。

在这里插入图片描述

重启后在开始菜单中找到 Windows store 并打开,然后搜索 Linux

在这里插入图片描述

或者点这个链接打开 https://www.microsoft.com/zh-cn/search/result.aspx?q=linux&form=MSHOME

选择需要安装的Linux 版本,然后点击获取 -> 安装

在这里插入图片描述

在这里插入图片描述

根据提示安装,设置用户名和口令,然后重启电脑。

建议安装 Windows Terminal 支持多Tab操作更加便利。

新版本的WLS文件系统与Windows的系统互通,可以非常简单复制传输编译文件。

安装编译环境

重启后,打开Ubuntu

在这里插入图片描述

或者通过 Window Terminal打开

在这里插入图片描述

更新现有软件库

sudo apt-get update

安装gcc编译工具

sudo apt-get install -y gcc

下载golang的环境并安装:

在这里插入图片描述

wget https://studygolang.com/dl/golang/go1.16.4.linux-amd64.tar.gz

sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.16.4.linux-amd64.tar.gz

sudo sh -c "echo 'export PATH=\$PATH:/usr/local/go/bin' >> /etc/profile"

关闭窗口,重新打开,使得环境变量生效。

当然也可以使用 source /etc/profile 命令使之生效。

go version

在这里插入图片描述
到这里 Golang 的编译环境安装完成。

接下配置Golang国内加速,使用的是 https://goproxy.cn/

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

如果你的项目中使用到私有仓库,私有仓库Golang配置请参考 《Go 私有仓库模块拉取 》 https://blog.csdn.net/q1009020096/article/details/108421435

到这里Golang的编译环境就已经准备结束。

交叉编译环境安装

这里需要安装 gcc arm的交叉编译工具,因为编译的是arm64位所以只需要安装64位编译工具就可以。

sudo apt-get install -y gcc-aarch64-linux-gnu

各类型交叉编译工具 参考 [4]

工具名armhf (32位)arm64 (64位)eabi (嵌入式)
gccgcc-arm-linux-gnueabihfgcc-aarch64-linux-gnugcc-arm-linux-gnueabi
g++g++-arm-linux-gnueabihfg++-aarch64-linux-gnug++-arm-linux-gnueabi

arm64 gcc叫做的aarch64的原因是:ARM64是Apple创建的,而AARCH64 GNU创建的。
他们名字不同但是表达的意思是一样的,就是表示 64的编译器。 参考 [5]

安装完成可以看看是否可用

aarch64-linux-gnu-gcc -v

在这里插入图片描述

到目前为止交叉编译工具已经准备完成。

编译

首先我们在我们把需要编译的Golang项目下载到D:\Project,假设我们的项目叫做cgodemo,打开Ubuntu子系统进入到该目录中
在这里插入图片描述

在WSL中使用/mnt目录挂载Windows上各个磁盘,上面的D:\Project\cgodemo,也就是/mnt/d/Project/cgodemo,我们在Ubuntu中进入该目录

cd /mnt/d/Project/cgodemo

在这里插入图片描述

接下来交叉编译我们go程序,下面涉及到的参数较多:

CGO_ENABLED=1 \
CC=aarch64-linux-gnu-gcc \
GOOS=linux \
GOARCH=arm64 \
go build -ldflags '-s -w --extldflags "-static -fpic"' .

参数详解:

  • CGO_ENABLED=1: 因为我们的程序使用到了Cgo,因此编译打开Cgo标志,默认情况是关闭的。
  • CC=aarch64-linux-gnu-gcc:指定CC也就是gcc编译命令使用交叉编译工具 aarch64-linux-gnu-gcc,也就是我们之前安装的交叉编译工具。
  • GOOS=linux:编译目标系统为Linux
  • GOARCH=arm64:编译目标的指令集架构为 64位 arm 架构
  • -ldflags ‘-s -w’:这个选项是为了移除编译后的程序的编译调试信息,减少可执行文件的体积。
  • –extldflags “-static -fpic”:静态编译,也就是会把使用到的动态库,静态链接到程序中,该指令存在时候可能会有warning提示,这是因为有些库文件是不能被静态链接的,gcc 编译器不支持 参考 [6]

上述命令会在当前目录下生成交叉编译后的程序:

cgodemo 就是最终的程序,现在你就可以把这个程序复制到 你的Linux设备上运行了。

参考资料

[1]. Go语言中文网 . studygolang . https://studygolang.com
[2]. 七牛云 . Goproxy.cn . https://goproxy.cn/
[3]. Go 私有仓库模块拉取 . Cliven_ken . 2020-09-05 . https://blog.csdn.net/q1009020096/article/details/108421435
[4]. 详细介绍Go 交叉汇编 ARM . quinn . 2020-11-29 . https://zhuanlan.zhihu.com/p/319682047
[5]. Differences between arm64 and aarch64 . Kyrill . 2015-08-06 . https://stackoverflow.com/questions/31851611/differences-between-arm64-and-aarch64
[6]. CGO 交叉静态编译 . eyasliu . 2019-11-20 . https://github.com/eyasliu/blog/issues/27

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值