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

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

环境安装

安装 WSL

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

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

在这里插入图片描述

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

在这里插入图片描述

选择需要安装的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的编译环境就已经准备结束。

交叉编译环境安装

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

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

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

gcc-arm-linux-gnueabihfgcc-aarch64-linux-gnugcc-arm-linux-gnueabig++-arm-linux-gnueabihfg++-aarch64-linux-gnug++-arm-linux-gnueabi

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

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

aarch64-linux-gnu-gcc -v

在这里插入图片描述

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

编译

D:\Projectcgodemo
/mntD:\Project\cgodemo/mnt/d/Project/cgodemo
cd /mnt/d/Project/cgodemo

在这里插入图片描述

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

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

参数详解:

CCaarch64-linux-gnu-gcc

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

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