Go构建与交叉编译
Go支持跨平台编译,无需目标平台工具链即可生成可执行文件。
go build基本使用
基本命令
Bash
# 编译当前目录
go build
# 编译指定包
go build ./cmd/server
# 指定输出文件名
go build -o myapp
# 编译并运行
go build && ./myapp
编译选项
Bash
# 指定输出名称
go build -o myapp main.go
# 减少二进制大小
go build -ldflags="-s -w"
# 静态编译(无动态链接)
go build -ldflags="-extldflags '-static'"
# 显示编译详情
go build -v
# 显示编译包
go build -x
交叉编译
GOOS和GOARCH设置
Bash
# GOOS:目标操作系统
# GOARCH:目标架构
# Linux amd64编译
GOOS=linux GOARCH=amd64 go build -o myapp-linux
# Windows amd64编译
GOOS=windows GOARCH=amd64 go build -o myapp.exe
# macOS arm64(M系列芯片)
GOOS=darwin GOARCH=arm64 go build -o myapp-mac
# Linux arm(树莓派)
GOOS=linux GOARCH=arm go build -o myapp-arm
支持的GOOS值
Bash
- linux:Linux系统
- windows:Windows系统
- darwin:macOS系统
- freebsd:FreeBSD系统
- android:Android
- ios:iOS
支持的GOARCH值
Bash
- amd64:64位x86架构
- arm64:64位ARM架构
- arm:32位ARM架构
- 386:32位x86架构
- mips/mips64:MIPS架构
查看支持组合
Bash
# 查看所有支持的GOOS/GOARCH组合
go tool dist list
# 输出:
# linux/amd64
# linux/arm
# windows/amd64
# darwin/amd64
# darwin/arm64
# ...
编译优化
减小二进制大小
Bash
# 移除调试信息和符号表
go build -ldflags="-s -w"
# -s:移除符号表
# -w:移除DWARF调试信息
# 效果:减小约30%体积
嵌入版本信息
Bash
# 编译时注入版本信息
go build -ldflags="-X main.version=v1.0.0"
# main.go
var version string
func main() {
fmt.Println(version) // v1.0.0
}
strip进一步减小
Bash
# Linux上使用strip
go build -ldflags="-s -w" -o myapp
strip myapp
# 可减小至最小体积
编译模式
静态编译
Go
# 完全静态链接(Linux)
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp
# 不依赖系统库
# 适合容器化部署
PIE模式
Go
# 位置无关可执行文件
go build -buildmode=pie
# 增强安全性(地址随机化)
条件编译
文件名条件编译
Bash
// 文件名包含GOOS或GOARCH自动选择性编译
// 只在Linux编译
main_linux.go
// 只在Windows编译
main_windows.go
// 只在amd64架构编译
main_amd64.go
// 组合条件
main_linux_amd64.go
构建标签
text
// 文件开头添加构建标签
// +build linux
package main
// 只在Linux编译此文件
// 多条件
// +build linux,amd64
// 排除条件
// +build !windows
编译流程表
| 步骤 | 命令 | 说明 |
|---|---|---|
| 编译 | go build | 默认编译 |
| 指定输出 | -o name | 自定义文件名 |
| 交叉编译 | GOOS=x GOARCH=y | 目标平台 |
| 优化体积 | -ldflags="-s -w" | 移除调试 |
| 静态编译 | CGO_ENABLED=0 | 无动态链接 |
常用编译组合
text
# 生产环境Linux编译
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -ldflags="-s -w" -o myapp-linux
# Windows桌面编译
GOOS=windows GOARCH=amd64 \
go build -ldflags="-H windowsgui" -o myapp.exe
# macOS通用编译(Intel + M芯片)
GOOS=darwin GOARCH=amd64 go build -o myapp-mac-amd64
GOOS=darwin GOARCH=arm64 go build -o myapp-mac-arm64
要点总结
- GOOS设置目标操作系统
- GOARCH设置目标架构
- go build -o指定输出文件名
- -ldflags="-s -w"减小二进制体积
- CGO_ENABLED=0禁用CGO,纯静态编译
- 文件名和构建标签实现条件编译
- 查看支持平台:go tool dist list
- Go交叉编译无需目标平台工具链
📝 发现内容有误?点击此处直接编辑