跳到主要内容

编译命令

前言

使用go help build命令可以查看帮助文档

常用命令

# -trimpath: 移除编译路径信息
# -ldflags: 用来传递给链接器额外的参数
# -s: 去掉符号表(symbol table)。符号表包括函数和变量的名字信息,主要用于调试和分析生成的二进制文件。如果程序不需要调试符号信息,可以使用这个选项减小二进制文件体积
# -w: 移除 DWARF 格式的调试信息。DWARF 是一种用于调试的标准,它包含关于程序的调试信息(例如变量类型、堆栈跟踪等)。
# -o: 指定生成的二进制文件名称,默认为 module 名称
go build -trimpath -ldflags '-s -w' -o myapp

编译时注入版本信息

借助-ldflags可以在编译时动态注入版本信息

  1. go mod init新建一个名为tmpgo的项目
  2. 编辑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)
}
  1. 创建目录cmd,并在其中新建文件cmd.go
package cmd

var BuildTime string
  1. 编译。对于main包,可直接使用main.XXX;对于其他包,需要指定package的路径。
go build -ldflags "-X main.version=0.0.1 -X tmpgo/cmd.BuildTime=2025-05-17"
  1. 运行编译后的文件
> .\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