目录

Go交叉编译成可执行文件在不同平台运行

Golang 支持交叉编译,是个非常方便的特性,在一个平台上生成另一个平台的可执行程序。

查看支持的平台

1
go tool dist list

如何进行交叉编译

编译命令示例

笔者电脑是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 所以要禁用它

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

Makefile直接生成所有平台

1
make build-all

Makefile生成linux平台

1
make build-linux

Makefile命令注意事项

  • make: Nothing to be done这句一般是提示你已经编译好了,而且没有对代码进行任何改动。
  • Makefile(注意大小写哦,M必须大写,其余必须小写)文件格式不规范,在all:或default:后面另起的一行命令中,行首没有TAB键的空格,或者有空格,但是是Space键的“ ”,不是Tab键的“ ”,这也是不行的! 解决方法,修改所有相关行使用Tab空格

demo地址:待补充

参考文章:Golang:交叉编译到Linux、macOS、windows并运行