Windows golang cgo交叉编译 linux arm64

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

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

环境安装

安装 WSL

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

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

Windows golang cgo交叉编译 linux arm64_第1张图片

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

Windows golang cgo交叉编译 linux arm64_第2张图片

或者点这个链接打开 https://www.microsoft.com/zh-cn/search/result.aspx?q=linux&form=MSHOME

选择需要安装的Linux 版本,然后点击获取 -> 安装

Windows golang cgo交叉编译 linux arm64_第3张图片

Windows golang cgo交叉编译 linux arm64_第4张图片

根据提示安装,设置用户名和口令,然后重启电脑。

建议安装 Windows Terminal 支持多Tab操作更加便利。

新版本的WLS文件系统与Windows的系统互通,可以非常简单复制传输编译文件。

安装编译环境

重启后,打开Ubuntu

Windows golang cgo交叉编译 linux arm64_第5张图片

或者通过 Window Terminal打开

Windows golang cgo交叉编译 linux arm64_第6张图片

更新现有软件库

sudo apt-get update

安装gcc编译工具

sudo apt-get install -y gcc

下载golang的环境并安装:

  • studygolang 下载页面 https://studygolang.com/dl
  • studygolang 安装说明 https://docs.studygolang.com/doc/install

Windows golang cgo交叉编译 linux arm64_第7张图片

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

Windows golang cgo交叉编译 linux arm64_第8张图片
到这里 Golang 的编译环境安装完成。

接下配置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

Windows golang cgo交叉编译 linux arm64_第9张图片

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

编译

首先我们在我们把需要编译的Golang项目下载到D:\Project,假设我们的项目叫做cgodemo,打开Ubuntu子系统进入到该目录中
Windows golang cgo交叉编译 linux arm64_第10张图片

在WSL中使用/mnt目录挂载Windows上各个磁盘,上面的D:\Project\cgodemo,也就是/mnt/d/Project/cgodemo,我们在Ubuntu中进入该目录

cd /mnt/d/Project/cgodemo

Windows golang cgo交叉编译 linux arm64_第11张图片

接下来交叉编译我们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]。

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

Windows golang cgo交叉编译 linux arm64_第12张图片

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

你可能感兴趣的:(Go,Linux,windows,linux,golang)