Windows golang cgo交叉编译 arm64

1,590 阅读3分钟

在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国内加速,使用的是 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设备上运行了。