在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