GOLANG交叉编译:从AMD64到ARM64

目录

GO 语言可以方便地实现跨平台交叉编译。

以在 amd64 平台上为 arm64 平台编译可执行程序为例进行说明。 amd64 平台使用 intel CPU,RedHat 操作系统。arm64 使用华为鲲鹏 CPU,CentOS 操作系统。

在执行编译命令前设置目标平台的环境变量。 因为 GO 交叉编译不支持 CGO,所以需要关掉 CGO。

export GOOS=linux GOARCH=arm64
export CGO_ENABLES=0

然后执行编译命令即可得到目标平台 arm64 的可执行程序。

背景

最近在 Hangzhou2022 项目中将 CMA-MESO 1KM 后处理系统从 CMA-PI HPC 到迁移到项目 HPC 上。 两个平台都使用 Linux 操作系统,但 CPU 架构不同。 CMA-PI 是 Intel 芯片,X86-64 架构,而项目 HPC 采用 Huawei 芯片,是 ARM64 架构。 对于使用 ecFlow 构建的业务系统流程来说,定义系统流程的 Python 脚本、完成具体任务的 SHELL 脚本都具有很强的跨平台迁移能力,无需太多改动。 但数值模式业务系统中除了数值模式本身的程序之外,还有很多支持程序,主要集中在前处理和后处理两部分。 在跨平台移植模式系统时,这类程序同样也需要进行迁移。

CMA-MESO 1KM 后处理系统中使用了笔者开发的数据文件检查工具 cemc-oper/nwpc-data-client。 该工具支持在多个目录中查找业务系统数据文件,是将各自独立运行的模式系统与后处理系统紧密相连的关键组件。 该工具使用GOLANG实现,在 CMA-PI HPC 上编译成可执行程序,应用在多个产品后处理系统中。 编译过程中,通过在工作电脑架设代理的方式,将依赖库下载到 HPC 上。

但 Hangzhou2022 项目中没有可以直接连外网的工作电脑,所以不能直接下载依赖库。 远程拷贝比较繁琐,所以笔者尝试跨平台交叉编译。 按本文介绍的方法在 CMA-PI 上编译后,将可执行程序拷贝到 Hangzhou2022 项目 HPC,可以正常运行。

总结

GOLANG 简单易学,非常适合开发命令行应用程序。 使用编译型语言 GOLANG 开发的应用程序更容易部署,只需要编译成一个可执行程序就可以在同一环境中任意运行,无需单独准备运行时环境。 而 Python 库通常由大量 Python 脚本文件组成,运行前需要准备 Python 运行时环境。 在业务系统中,如果不同 Python 脚本依赖不同的 Python 环境,则非常容易造成混淆,也会增加维护成本。 但 GOLANG 比 Python 更加小众,目前在 CEMC 的天气业务系统中仅有几个小工具使用 GOLANG 编写,而且相应的功能用其他语言实现也非常容易。 笔者对 GOLANG 在单位应用的未来前景持谨慎态度,至少在近期不会推广该语言。 当前最重要的还是加强对 Python 的应用,构建并推广基于 Python 工具链,扩大内部开发的 Python 开源库在气象社区内的影响。

参考

cemc-oper/nwpc-data-client