golang 交叉编译
不试不知道,一试吓一跳
前言
期末做了个项目,刚好是用的 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 平台下的 powershell 和 cmd 不支持像 *nix
系的系统的 bash
可以在一条命令中设置环境变量,所以把上面的写成 .bat 文件来进行跨平台编译。下面就用编译 Linux/amd64 来举例
在项目的main包的main函数所在文件的位置新建一个 bat文件,名字随意,然后填入下面的内容
1 |
|
保存,然后运行,就可以发现编译出来了。
更新 (2020年12月17日):
在 GOOS 等项后面不能跟空格,直接复制的话会出问题,复制好了之后记得检查一下末尾的空格。
通过 Git-Bash 编译
不过这样太麻烦了,不是么?其实如果安装了 Git 的话,直接在对应的目录右键打开Git Bash Here,然后就可以像 Linux 和 MacOS 下一样直接用
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o output_file_name
就可以进行编译了。轻松加愉悦~
参考
Golang 在 Mac、Linux、Windows 下如何交叉编译
openwrt环境下无法运行 #97
GoMips#building-for-ar71xx-openwrt