golang 交叉编译

本文最后更新于:2021年1月2日 下午

不试不知道,一试吓一跳

前言

期末做了个项目,刚好是用的 golang ,于是试试 golang 的交叉编译是有多神奇。没想到,这个编译这么方便。

正文

环境

  • go version go1.15.6 windows/amd64

怎么交叉编译

简单来说就是设置好 go 的相关参数,然后编译就可以了。
说实话挺简单的,先设置好 目标系统 ,然后是 目标架构,关掉 CGO , 然后就可以实现了。
简单来说是下面这样

目标系统 目标架构 命令
Windows x64 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o output_file_name
Linux x64 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o output_file_name
MacOS x64 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o output_file_name
Linux arm CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -o output_file_name
Linux mips CGO_ENABLED=0 GOOS=linux GOARCH=mips GOMIPS=softfloat go build -trimpath -ldflags="-s -w" -o output_file_name

其实最开始没想找 mips 上的编译方法的。我最开始是想把一个小项目放到我的路由器上跑,于是我直接用的 Linux/arm 上的编译方法来编译的。结果直接报错了,说

line 1: syntax error: unexpected word (expecting “)”)

于是一番查找,发现是可执行文件的格式不对,这个报错说明这个文件和这个架构不兼容。

于是用 uname -a 查看了一下路由器的架构,结果才发现是 mips 架构的。

Linux OpenWrt 4.14.195 #0 Mon Sep 21 07:10:02 2020 mips GNU/Linux

于是又是一番查找,才在 openwrt 环境下无法运行 #97 中发现了GoMips#building-for-ar71xx-openwrt。于是才找到了对应的方法

env GOOS=linux GOARCH=mips GOMIPS=softfloat go build -trimpath -ldflags="-s -w" ‘server.go’
upx -9 server

Windows 下交叉编译

通过写 bat 文件进行交叉编译

因为 Windows 平台下的 powershellcmd 不支持像 *nix 系的系统的 bash 可以在一条命令中设置环境变量,所以把上面的写成 .bat 文件来进行跨平台编译。下面就用编译 Linux/amd64 来举例
在项目的 main 包的 main 函数所在文件的位置新建一个 bat文件,名字随意,然后填入下面的内容

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o release_linux_x64

保存,然后运行,就可以发现编译出来了。

更新 (2020 年 12 月 17 日):

GOOS 等项后面不能跟空格,直接复制的话会出问题,复制好了之后记得检查一下末尾的空格。

通过 Git-Bash 编译

不过这样太麻烦了,不是么?其实如果安装了 Git 的话,直接在对应的目录右键打开Git Bash Here,然后就可以像 LinuxMacOS 下一样直接用

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o output_file_name

就可以进行编译了。轻松加愉悦~

参考

Golang 在 Mac、Linux、Windows 下如何交叉编译
openwrt 环境下无法运行 #97
GoMips#building-for-ar71xx-openwrt