静态链接库Static Libraries和动态链接库Dynamic Libraries
· 阅读需 3 分钟
静态链接库
在编译阶段,静态库的内容直接复制到最终的可执行文件中 一旦程序被编译,它就包含了所有它需要的代码和资源,无需外部库文件
优点
自包含 可执行文件包含所有必需的库代码,便于分发
启动性能 无需在运行时加载外部库,可能提高加载速度
缺点
文件大小 可执行文件较大,因包含了所有库代码
更新困难 库更新后,所有使用该库的应用都需重新编译和分发
动态链接库
动态库在程序运行时被加载 可执行文件包含库的引用,实际的库代码在运行时才载入内存 多个程序可以共享同一份库副本
优点
节省空间 多个程序可共享单一库副本
更新容易 更新库文件后,所有使用该库的程序自动受益
缺点
依赖性 必须确保运行时库可用,否则程序无法启动
性能开销 加载库可能增加程序启动时间,运行时解析也可能轻微影响性能
举例说明
如果你的程序需要进行数学计算,如求平方根,你可能会使用数学库(比如 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"
是传递给外部链接器的,确保没有动态库被链接