在 Ubuntu 下把 Go 代码打成静态库,核心并不在于命令多复杂,而是要先分清楚项目结构、模块声明和构建参数分别在解决什么问题。下面按实际操作顺序把流程拆开,同时解释每一步的作用,方便你判断最终生成的 libmylib.a 是否符合自己的使用场景。
先确认 Go 环境是否可用
开始之前,先确保系统里已经安装 Go。如果还没有安装,可以直接到 Go 官方下载页面获取 Ubuntu 对应版本:
安装完成后,先在终端里检查版本,确认命令可用:
go version
只要终端能正常返回版本信息,就可以继续后面的模块初始化和编译步骤。原文示例使用的是 Go 1.17,因此后续的 go.mod 也按这个版本来写。
创建项目目录并初始化模块
为了避免静态库文件和其他工程混在一起,建议单独建一个目录。示例目录名为 mylib:

mkdir mylib
cd mylib
进入目录后,新建 go.mod 文件,用来声明模块名和 Go 版本:
module mylib
go 1.17
这里的重点有两个:
为什么要先写 go.mod
go.mod 是 Go 模块的基础配置文件,后续编译时会用它来识别当前项目的模块信息和依赖范围。即使示例代码很简单,这一步也不要省略。
模块名和版本怎么理解
示例里的模块名直接写成 mylib,适合本地演示。go 1.17 对应的是原始示例里的目标版本,保持一致可以减少环境差异带来的问题。
编写要导出的 Go 源文件
模块准备好之后,就可以写实际的 Go 代码了。这里沿用一个最小示例,在 mylib.go 中定义一个加法函数:
package mylib
func Add(a int, b int) int {
return a + b
}
这个例子的重点不是功能本身,而是先验证从源码到静态库的完整链路能否跑通。等这一步成功后,再替换成自己的实际业务代码会更稳妥。
执行构建命令生成 .a 静态库
完成源码编写后,就可以开始编译。原始命令如下:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o libmylib.a mylib.go
执行成功后,当前目录下会生成一个 libmylib.a 文件,这就是目标静态库。
这条命令里的参数分别在做什么
这条命令看起来长,但实际可以拆成几部分理解:
CGO_ENABLED=0:关闭 CGO,确保生成的是纯 Go 静态链接结果。GOOS=linux:指定目标操作系统为 Linux。GOARCH=amd64:指定目标架构为 amd64。-a:强制重新编译所有包。-installsuffix cgo:给安装目录增加后缀,用来避免冲突。-o libmylib.a:指定输出文件名为libmylib.a。
生成结果应该怎么看
如果命令执行完成且目录里出现了 libmylib.a,说明这次构建已经产出了静态库文件。对于教程场景,这就是最直接的成功标志。
生成后的静态库能怎么用
得到 .a 文件后,常见用途主要有两类。
供其他 Go 项目使用
这个静态库可以继续被其他 Go 项目引用,前提是你的项目组织方式和引用方式与目标工程保持一致。
通过 CGO 与 C/C++ 程序链接
原始说明里还提到,这个 .a 文件也可以通过 CGO 机制与 C/C++ 程序链接。实际使用时,需要在对应项目里包含这个库,并在链接阶段明确指定库文件路径和文件名。
如果你的目标只是先在 Ubuntu 上完成 Go 静态库构建,那么可以先以本文的最小示例为准:确认 Go 环境、写好 go.mod、准备源文件,再执行构建命令。只要这四步能顺利走通,后面再扩展到更复杂的模块和链接方式会容易很多。







