编译命令
前言
使用go help build
命令可以查看帮助文档
常用命令
# -trimpath: 移除编译路径信息
# -ldflags: 用来传递给链接器额外的参数
# -s: 去掉符号表(symbol table)。符号表包括函数和变量的名字信息,主要用于调试和分析生成的二进制文件。如果程序不需要调试符号信息,可以使用这个选项减小二进制文件体积
# -w: 移除 DWARF 格式的调试信息。DWARF 是一种用于调试的标准,它包含关于程序的调试信息(例如变量类型、堆栈跟踪等)。
# -o: 指定生成的二进制文件名称,默认为 module 名称
go build -trimpath -ldflags '-s -w' -o myapp
编译时注入版本信息
借助-ldflags
可以在编译时动态注入版本信息
- 用
go mod init
新建一个名为tmpgo
的项目 - 编辑
main.go
,填写以下内容
package main
import (
"fmt"
"tmpgo/cmd"
)
var version string
func main() {
fmt.Printf("Version: %s\n", version)
fmt.Printf("Build Time: %s\n", cmd.BuildTime)
}
- 创建目录
cmd
,并在其中新建文件cmd.go
package cmd
var BuildTime string
- 编译。对于
main
包,可直接使用main.XXX
;对于其他包,需要指定package的路径。
go build -ldflags "-X main.version=0.0.1 -X tmpgo/cmd.BuildTime=2025-05-17"
- 运行编译后的文件
> .\tmpgo.exe
Version: 0.0.1
Build Time: 2025-05-17
交叉编译
交叉编译主要通过设置两个环境变量来实现:GOOS 和 GOARCH。
GOOS
(Go Operating System) 指定目标操作系统。GOARCH
(Go Architecture) 指定目标处理器架构。
使用go tool dist list
命令可查看 Go 当前版本支持的所有交叉编译目标(GOOS/GOARCH 组合)
Windows 交叉编译给 Linux 环境和Mac环境的二进制包
# x86-64 的 linux
$env:GOOS = "linux"
$env:GOARCH = "amd64"
go build -o your_program_name_linux
# x86 的 linux
$env:GOOS = "linux"
$env:GOARCH = "386"
go build -o your_program_name_linux_386
# amd64 的 mac
$env:GOOS = "darwin"
$env:GOARCH = "amd64"
go build -o your_program_name_mac_intel
# arm64 的 mac
$env:GOOS = "darwin"
$env:GOARCH = "arm64"
go build -o your_program_name_mac_arm64