【无标题】Linux中静态库和动态库

在 Linux 中,静态库(Static Library)和动态库(Dynamic Library,又称共享库 Shared Library)是两种不同的代码复用方式,用于将可重用代码打包供其他程序使用,核心区别在于链接时机和代码加载方式。

一、静态库(.a 文件)

静态库是编译时被完整复制到目标程序中的库文件,扩展名通常为 .a(Archive)。

特点:
  1. 编译时链接:在程序编译阶段(链接阶段),静态库中的代码会被完整复制到可执行文件中。
  2. 独立运行:生成的可执行文件不依赖外部库,可单独运行(无外部依赖)。
  3. 文件体积大:由于包含库代码,可执行文件体积较大。
  4. 更新麻烦:若静态库更新,依赖它的程序必须重新编译才能使用新功能。
创建与使用步骤:
  1. 编译源文件为目标文件(.o
    gcc -c func1.c func2.c  # 生成 func1.o、func2.o
    
  2. 打包为静态库
    ar rcs libmylib.a func1.o func2.o  # 生成静态库 libmylib.a
    
  3. 链接静态库编译程序
    gcc main.c -L. -lmylib -o myapp  # -L. 指定库路径,-lmylib 链接 libmylib.a
    

二、动态库(.so 文件)

动态库是程序运行时才被加载的库文件,扩展名通常为 .so(Shared Object)。

特点:
  1. 运行时链接:编译时仅记录库的引用,程序运行时才从系统加载库文件。
  2. 共享代码:多个程序可共享同一个动态库,节省内存和磁盘空间。
  3. 文件体积小:可执行文件仅包含库的引用,体积较小。
  4. 更新方便:动态库更新后,依赖它的程序无需重新编译(只需重启程序)。
  5. 依赖外部文件:程序运行时必须能找到对应的动态库,否则会报错(如 error while loading shared libraries)。
创建与使用步骤:
  1. 编译源文件为位置无关目标文件(.o
    gcc -fPIC -c func1.c func2.c  # -fPIC 生成位置无关代码(动态库必需)
    
  2. 生成动态库
    gcc -shared -o libmylib.so func1.o func2.o  # 生成动态库 libmylib.so
    
  3. 链接动态库编译程序
    gcc main.c -L. -lmylib -o myapp  # 编译方式与静态库相同,但运行时需加载.so文件
    
  4. 运行程序
    需确保动态库可被系统找到(可将库路径添加到 LD_LIBRARY_PATH 环境变量,或放入 /usr/lib 等系统默认路径):
    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  # 临时指定库路径
    ./myapp
    

三、核心区别对比

特性静态库(.a动态库(.so
链接时机编译时(链接阶段)运行时(程序启动或调用时)
可执行文件体积大(包含库代码)小(仅包含引用)
内存占用高(多个程序各自包含副本)低(多个程序共享一份库代码)
库更新影响必须重新编译程序无需重新编译,重启程序即可
依赖性无外部依赖,可独立运行依赖外部 .so 文件,缺失则无法运行
典型使用场景小型程序、需独立部署的程序大型程序、多个程序共享的通用功能

四、如何选择?

  • 用静态库:当需要程序独立运行(无外部依赖)、对启动速度要求高,或库更新频率低时。
  • 用动态库:当多个程序共享同一功能、希望减小可执行文件体积,或需频繁更新库功能时。

例如:系统工具(如 ls)常用动态库节省资源;嵌入式设备中的程序常用静态库避免依赖问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值