Mac下编译Linux, Windows
1 2 3 4 5 6 7 |
# Linux CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build filename.go # Windows CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build filename.go 如: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o helloworld-windows helloworld.go |
Linux下编译Mac, Windows
1 2 3 4 5 |
# Mac CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build filename.go # Windows CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build filename.go |
Windows下编译Mac, Linux
记住,不要使用powershell ,要使用cmd才行。
1 2 3 4 5 6 7 8 9 10 11 |
# Mac SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build filename.go # Linux SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build filename.go |
如果需要使用powershell 交叉编译,需要如下命令,因为powershell和cmd设置环境变量的方式不一样。
1 2 3 4 5 |
$env:CGO_ENABLED=0 $env:GOPATH="amd64" $env:GOOS="linux" go build filename.go -o "outputName" |
CGO_ENABLED
作用:
用于标识(声明) cgo 工具是否可用
意义:
存在交叉编译的情况时,cgo 工具是不可用的。在标准go命令的上下文环境中,交叉编译意味着程序构建环境的目标计算架构的标识与程序运行环境的目标计算架构的标识不同,或者程序构建环境的目标操作系统的标识与程序运行环境的目标操作系统的标识不同
小结:
结合案例来说,我们是在宿主机编译的可执行文件,而在 Scratch 镜像运行的可执行文件;显然两者的计算机架构、运行环境标识你无法确定它是否一致(毕竟构建的 docker 镜像还可以给他人使用),那么我们就要进行交叉编译,而交叉编译不支持 cgo,因此这里要禁用掉它
关闭 cgo 后,在构建过程中会忽略 cgo 并静态链接所有的依赖库,而开启 cgo 后,方式将转为动态链接
补充:
golang 是默认开启 cgo 工具的,可执行 go env
命令查看
GOOS
用于标识(声明)程序构建环境的目标操作系统
如:
- linux
- windows
GOARCH
用于标识(声明)程序构建环境的目标计算架构
若不设置,默认值与程序运行环境的目标计算架构一致(案例就是采用的默认值)
如:
- amd64
- 386
系统 | GOOS | GOARCH |
---|---|---|
Windows 32位 | windows | 386 |
Windows 64位 | windows | amd64 |
OS X 32位 | darwin | 386 |
OS X 64位 | darwin | amd64 |
Linux 32位 | linux | 386 |
Linux 64位 | linux | amd64 |
GOHOSTOS
用于标识(声明)程序运行环境的目标操作系统
GOHOSTARCH
用于标识(声明)程序运行环境的目标计算架构
go build
-a
强制重新编译,简单来说,就是不利用缓存或已编译好的部分文件,直接所有包都是最新的代码重新编译和关联
-installsuffix
作用:
在软件包安装的目录中增加后缀标识,以保持输出与默认版本分开
补充:
如果使用 -race 标识,则后缀就会默认设置为 -race 标识,用于区别 race 和普通的版本
-o
指定编译后的可执行文件名称