跳到主要内容

静态链接库Static Libraries和动态链接库Dynamic Libraries

· 阅读需 3 分钟
素明诚
Full stack development

静态链接库

在编译阶段,静态库的内容直接复制到最终的可执行文件中 一旦程序被编译,它就包含了所有它需要的代码和资源,无需外部库文件

优点

自包含 可执行文件包含所有必需的库代码,便于分发

启动性能 无需在运行时加载外部库,可能提高加载速度

缺点

文件大小 可执行文件较大,因包含了所有库代码

更新困难 库更新后,所有使用该库的应用都需重新编译和分发

动态链接库

动态库在程序运行时被加载 可执行文件包含库的引用,实际的库代码在运行时才载入内存 多个程序可以共享同一份库副本

优点

节省空间 多个程序可共享单一库副本

更新容易 更新库文件后,所有使用该库的程序自动受益

缺点

依赖性 必须确保运行时库可用,否则程序无法启动

性能开销 加载库可能增加程序启动时间,运行时解析也可能轻微影响性能

举例说明

如果你的程序需要进行数学计算,如求平方根,你可能会使用数学库(比如 C 语言的 math.h

静态链接 在编译时,math.h 提供的函数直接被复制到你的可执行文件中,使得程序不需要在系统中查找数学库

动态链接 程序保留对数学库函数的引用,不直接包含这些代码 当程序运行时,操作系统加载这些函数的动态库(如 libm.so) 如果其他程序也使用这些函数,它们可以共享同一份 libm.so

go 创建静态链接的可执行文件

下面是创建一个静态链接的 Go 程序的一般步骤和指令

# 设置 CGO_ENABLED=0 禁用 CGO
CGO_ENABLED=0

# 使用 go build 命令并加入适当的标志
go build -tags netgo -ldflags '-extldflags "-static"'

参数说明

CGO_ENABLED=0

禁用 CGO,确保不调用任何 C 代码库,这是实现纯静态链接的关键

-tags netgo

确保 Go 使用其自己的网络库(net package)实现,而不是系统的网络库。这有助于在网络操作中也保持静态链接,尤其是 DNS 解析相关功能

-ldflags '-extldflags "-static"'

静态链接。-extldflags "-static" 是传递给外部链接器的,确保没有动态库被链接