只需要指定目标操作系统的平台和处理器架构即可:

**命令行方式,**因为不支持CGO,所以要禁用CGO

  • SET CGO_ENABLED=0 // 禁用CGO
  • SET GOOS=linux // 目标平台是linux
  • SET GOARCH=amd64 // 目标处理器架构是amd64

Mac 下编译 Linux 和 Windows 平台 64位 可执行程序

  • CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
  • CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Linux下编译 Mac 和 Windows 平台64位可执行程序

  • CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
  • CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Windows下编译Mac平台64位可执行程序

  • SET CGO_ENABLED=0
  • SET GOOS=darwin
  • SET GOARCH=amd64
  • go build

make file 方式

 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
28
29
30
# Binary name
BINARY=your_app_name
# Builds the project
build:
		go build -o ${BINARY}
		go test -v
# Installs our project: copies binaries
install:
		go install
release:
		# Clean
		go clean
		rm -rf *.gz
		# Build for mac
		go build
		tar czvf ydict-mac64-${VERSION}.tar.gz ./ydict
		# Build for linux
		go clean
		CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
		tar czvf your_app_name-linux64-${VERSION}.tar.gz ./ydict
		# Build for win
		go clean
		CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
		tar czvf your_app_name-win64-${VERSION}.tar.gz ./ydict.exe
		go clean
# Cleans our projects: deletes binaries
clean:
		go clean

.PHONY:  clean build

整个过程看起来非常简单,运行起来也非常简单,调用make release命令,并给VERSION变量赋值不同的版本号即可: make release VERSION=0.9

命令会编译出不同平台可运行的压缩包:

  • ydict-mac64-0.9.tar.gz
  • ydict-linux64-0.9.tar.gz
  • ydict-win64-0.9.tar.gz

所有可以编译的系统,下面是源码:

https://github.com/golang/go/blob/master/src/go/build/syslist.go

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package build

// Past, present, and future known GOOS and GOARCH values.
// Do not remove from this list, as these are used for go/build filename matching.

var knownOS = map[string]bool{
	"aix":       true,
	"android":   true,
	"darwin":    true,
	"dragonfly": true,
	"freebsd":   true,
	"hurd":      true,
	"illumos":   true,
	"ios":       true,
	"js":        true,
	"linux":     true,
	"nacl":      true,
	"netbsd":    true,
	"openbsd":   true,
	"plan9":     true,
	"solaris":   true,
	"windows":   true,
	"zos":       true,
}
var knownArch = map[string]bool{
	"386":         true,
	"amd64":       true,
	"amd64p32":    true,
	"arm":         true,
	"armbe":       true,
	"arm64":       true,
	"arm64be":     true,
	"loong64":     true,
	"mips":        true,
	"mipsle":      true,
	"mips64":      true,
	"mips64le":    true,
	"mips64p32":   true,
	"mips64p32le": true,
	"ppc":         true,
	"ppc64":       true,
	"ppc64le":     true,
	"riscv":       true,
	"riscv64":     true,
	"s390":        true,
	"s390x":       true,
	"sparc":       true,
	"sparc64":     true,
	"wasm":        true,
}