Go 语言天生支持跨平台编译,并且其标准库几乎不依赖系统动态库,所以在大多数场景下,它编译出来的二进制文件几乎可以直接丢到任何机器运行。 但实际开发中,我们经常遇到两个问题:
Go 语言天生支持跨平台编译,并且其标准库几乎不依赖系统动态库,所以在大多数场景下,它编译出来的二进制文件几乎可以直接丢到任何机器运行。 但实际开发中,我们经常遇到两个问题:
这篇文章会从基础概念讲起,逐步深入,并附带一个一键多平台静态编译脚本,让你少踩坑。 1. 基础概念
Go 天生适合静态编译,因为:
只有当项目用了 CGO(如 sqlite、openssl)才会出现动态依赖,需要额外处理。 2. 完全静态编译纯 Go 项目(最简单)
验证:
有 CGO 依赖(sqlite、openssl 等) 默认会动态链接 glibc,要用 musl 完全静态化:
验证:
3. 交叉编译(跨平台 + 静态)Go 内置交叉编译能力,只需 GOOS/GOARCH:
4. Docker 结合静态编译
推荐:
5. 一键多平台静态编译脚本
执行:
最终你会得到:
可以分发给对应的二进制平台即可 其他:musl 是 一个轻量的 C 标准库实现,主要用来替代传统的 glibc。 Go 编译器在用 CGO 时,需要链接 C 运行库(libc),默认是 glibc,但 glibc 的动态库在不同 Linux 发行版版本不同,容易产生兼容性问题。 musl 的特点是:
所以,如果你想让一个含 CGO 的 Go 程序 完全静态,就得用 musl-gcc 替代 gcc,这样 libc 也能被编进二进制里。 glibc vs musl 直观对比
|
2022-04-28
2022-04-21
2022-05-13
2022-08-17
2024-05-07