Golang 支持交叉编译,是个非常方便的特性,在一个平台上生成另一个平台的可执行程序。
1. 查看支持的平台
2. 如何进行交叉编译
2.1 编译命令示例
笔者电脑是Mac,所以这里演示一下在Mac上编译可以在Linux和Windows运行的程序
1
2
3
CGO_ENABLED = 0 GOOS = darwin GOARCH = amd64 go build main.go
CGO_ENABLED = 0 GOOS = linux GOARCH = amd64 go build main.go
CGO_ENABLED = 0 GOOS = windows GOARCH = amd64 go build main.go
参数命令解释
GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
GOARCH:目标平台的体系架构(386、amd64、arm)
交叉编译不支持 CGO 所以要禁用它
2.2 Makefile示例
如果经常需要编译多个平台的操作,可以将命令整合到Makefile中,go build -o 指定输出路径。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 编译到 Linux
.PHONY: build-linux
build-linux:
CGO_ENABLED = 0 GOOS = linux GOARCH = amd64 go build -o ./build/main-linux ./main.go
# 编译到 macOS
.PHONY: build-darwin
build-darwin:
CGO_ENABLED = 0 GOOS = darwin GOARCH = amd64 go build -o ./build/main-darwin ./main.go
# 编译到 windows
.PHONY: build-windows
build-windows:
CGO_ENABLED = 0 GOOS = windows GOARCH = amd64 go build -o ./build/main-windows.exe ./main.go
# 编译到 全部平台
.PHONY: build-all
build-all:
make clean
mkdir -p ./build
make build-linux
make build-darwin
make build-windows
.PHONY: clean
clean:
rm -rf ./build
2.3 Makefile直接生成所有平台
2.4 Makefile生成linux平台
2.5 Makefile命令注意事项
make: Nothing to be done这句一般是提示你已经编译好了,而且没有对代码进行任何改动。
Makefile(注意大小写哦,M必须大写,其余必须小写)文件格式不规范,在all:或default:后面另起的一行命令中,行首没有TAB键的空格,或者有空格,但是是Space键的“ ”,不是Tab键的“ ”,这也是不行的!
解决方法,修改所有相关行使用Tab空格
demo地址:待补充
参考文章:Golang:交叉编译到Linux、macOS、windows并运行