在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的环境并安装:
- studygolang 下载页面 https://studygolang.com/dl
- studygolang 安装说明 https://docs.studygolang.com/doc/install
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国内加速,使用的是 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"' .
参数详解:
- 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设备上运行了。