在Windows上编译Linux Arm64 架构的go程序,最简单的方式是使用 WSL (Windows的linux子系统)
目标是在 Windows 编译ARM64的含有Cgo的 Golang程序。
在控制面板找到 程序 然后 选择 启用或关闭 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国内加速,使用的是 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 (嵌入式) |
---|---|---|---|
gcc | gcc-arm-linux-gnueabihf |
gcc-aarch64-linux-gnu |
gcc-arm-linux-gnueabi |
g++ | g++-arm-linux-gnueabihf |
g++-aarch64-linux-gnu |
g++-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"' .
参数详解:
CC
也就是gcc编译命令使用交叉编译工具 aarch64-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