温馨提示×

ubuntu golang能静态打包吗

小樊
44
2026-10-24 22:52:18
栏目: 编程语言

可以的。在 Ubuntu 上用 Go 是可以静态打包(静态编译)的,而且 Go 默认就比其他语言更容易做到静态链接。

下面分几种常见情况说明:


一、纯 Go 代码(不依赖 C 库)

如果你没有使用 cgo(比如没用 import "C"、没用 sqlite3 的 cgo 版等),默认就是静态可执行文件:

go build -o app main.go

检查是否静态:

file app
ldd app

如果看到:

not a dynamic executable

说明已经是静态二进制了 ✅


二、在 Ubuntu 上强制静态编译(推荐写法)

CGO_ENABLED=0 go build -o app main.go

这是最常用、最安全的静态打包方式。


三、使用了 cgo(比如某些数据库驱动)

如果用了 cgo(例如:

  • github.com/mattn/go-sqlite3
  • 某些 crypto / zlib 库 )

那就不是纯静态了,会依赖 libc。

方案 1:禁用 cgo(如果业务允许)

CGO_ENABLED=0 go build

方案 2:用 musl 静态链接(推荐用于 Docker)

sudo apt install musl-tools
CGO_ENABLED=1 CC=musl-gcc go build --ldflags '-extldflags "-static"' -o app

四、Docker 中常见静态打包(最佳实践)

FROM golang:1.22 AS build
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o app

FROM scratch
COPY --from=build /app/app /app
ENTRYPOINT ["/app"]

这样出来的镜像只有几 MB,且完全静态。


五、总结

场景 是否静态 方法
纯 Go ✅ 默认
Ubuntu 编译 ✅ CGO_ENABLED=0
用 cgo ❌ 需 musl
Docker ✅ scratch + CGO=0

如果你愿意,可以告诉我:

  • Go 版本
  • 是否用了 sqlite / 数据库
  • 是否用于 Docker

我可以给你精确可用的编译命令。

0 踩