当前位置: 首页 > news >正文

基于Linux,看清C++的动态库和静态库

动态库和静态库是Linux编程中常用的两种库类型,它们在编译、链接和运行时的行为上存在本质区别,适用于不同的应用场景。本文将详细讲解静态库和动态库的本质区别、应用场景,以及如何通过示例代码、制作和应用动态库及静态库来理解它们的使用。


一、静态库和动态库的本质区别

1. 静态库(Static Library)

静态库是编译时将库的代码直接链接到可执行文件中。程序运行时不再依赖外部的库文件。

  • 优点
    • 程序体积较大,但运行时不需要额外加载库文件,启动速度较快。
    • 适用于对程序体积和启动速度有较高要求的场景,如嵌入式系统。
  • 缺点
    • 占用空间较大,因为每个程序都包含完整的库代码。
    • 更新库时需要重新编译所有依赖该库的程序。

2. 动态库(Dynamic Library)

动态库在程序运行时才加载库代码。动态库的代码不会被嵌入到可执行文件中,而是以独立的共享库文件(如.so文件)的形式存在。

  • 优点
    • 程序体积较小,多个程序可以共享同一个动态库。
    • 动态库可以独立更新,无需重新编译所有依赖程序。
  • 缺点
    • 程序启动时需要加载动态库,可能会增加启动时间。
    • 动态库需要随程序分发,否则程序无法运行。

二、应用场景的区别

1. 静态库适用场景

  • 程序需要独立运行,且不依赖外部环境(如嵌入式系统)。
  • 程序需要快速启动,且对体积要求不高。
  • 库代码不需要频繁更新。

2. 动态库适用场景

  • 多个程序共享同一个库文件。
  • 库代码需要频繁更新(如系统库、第三方库)。
  • 程序需要跨平台或跨版本兼容。

三、示例代码:GuoYao调用YongYong

1. 静态库示例

静态库代码(yongyong.c)

#include <stdio.h>void yongyong_function() {printf("This is YongYong's function in static library!\n");
}

主程序代码(guoyao.c)

#include <stdio.h>void yongyong_function();int main() {printf("GuoYao is calling YongYong's function...\n");yongyong_function();return 0;
}

编译和链接命令

# 生成静态库
ar rcs libyongyong.a yongyong.o# 编译并链接
gcc guoyao.c -L. -lyongyong -o guoyao_static

运行程序

./guoyao_static

输出

GuoYao is calling YongYong's function...
This is YongYong's function in static library!

2. 动态库示例

动态库代码(yongyong.c)

#include <stdio.h>void yongyong_function() {printf("This is YongYong's function in dynamic library!\n");
}

主程序代码(guoyao.c)

#include <stdio.h>void yongyong_function();int main() {printf("GuoYao is calling YongYong's function...\n");yongyong_function();return 0;
}

编译和链接命令

# 生成动态库
gcc -shared -fPIC yongyong.c -o libyongyong.so# 编译并链接
gcc guoyao.c -L. -lyongyong -o guoyao_dynamic

运行程序

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  # 设置动态库搜索路径
./guoyao_dynamic

输出

GuoYao is calling YongYong's function...
This is YongYong's function in dynamic library!

四、制作动态库及应用动态库

1. 制作动态库

步骤

  1. 编写动态库代码(如yongyong.c)。

  2. 使用gcc生成动态库:

    gcc -shared -fPIC yongyong.c -o libyongyong.so
    
    • -shared:生成共享库(动态库)。
    • -fPIC:生成位置无关代码(Position Independent Code),适用于动态加载。
  3. 使用动态库:

    gcc guoyao.c -L. -lyongyong -o guoyao_dynamic
    
    • -L.:指定当前目录为库搜索路径。
    • -lyongyong:链接libyongyong.so

2. 运行动态库程序

  • 确保动态库路径在LD_LIBRARY_PATH中:
    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    
  • 运行程序:
    ./guoyao_dynamic
    

五、制作静态库及应用静态库

1. 制作静态库

步骤

  1. 编写静态库代码(如yongyong.c)。
  2. 编译生成目标文件:
    gcc -c yongyong.c -o yongyong.o
    
  3. 使用ar生成静态库:
    ar rcs libyongyong.a yongyong.o
    
    • ar是静态库打包工具。
    • -r:替换现有文件。
    • -c:生成索引。

2. 应用静态库

步骤

  1. 编写主程序代码(如guoyao.c)。

  2. 编译并链接:

    gcc guoyao.c -L. -lyongyong -o guoyao_static
    
    • -L.:指定当前目录为库搜索路径。
    • -lyongyong:链接libyongyong.a
  3. 运行程序:

    ./guoyao_static
    

六、总结

  • 静态库适用于对启动速度和独立性要求较高的场景,但程序体积较大且更新不便。
  • 动态库适用于需要共享库代码的场景,程序体积较小且支持动态更新。
  • 在实际开发中,选择静态库还是动态库需要根据具体需求进行权衡。

通过本文的示例代码和制作流程,读者可以更直观地理解静态库和动态库的区别及应用场景。希望本文能够帮助开发者更好地掌握Linux编程中库的使用技巧。

http://www.dtcms.com/a/390030.html

相关文章:

  • 多导睡眠五大PSG数据集统一格式化处理|SHHS
  • ZeroMQ基础
  • 【JavaGuide学习笔记】什么,Java中 native 也是一个关键字?
  • 【LWIP】STM32F429 + LWIP + DP83848 热插拔问题总结
  • RGWRados::Object::Write::_do_write_meta()
  • Shopify 集合页改造:增加 Banner 图片 + 点击加载更多功能
  • 泛函 Φ(u) = ∫[(u″)² + u² + 2f(x)u]dx − (u′(0))² 在 u(0)=u(1) 下的驻点方程与边界条件
  • JAVA高频面试题汇总:Java+ 并发 +Spring+MySQL+ 分布式 +Redis+ 算法 +JVM 等
  • 构建与运营“爬虫 IP 代理池”的方法论
  • 【文献笔记】Point Transformer
  • Linux | i.MX6ULL Modbus 移植和使用(第二十一章)
  • 几种微前端框架的沙箱策略
  • 黑盒测试:测试用例设计之边界值设计方法(边界值分析法)(上点、离点、内点)健壮性测试、单缺陷假设理论
  • 【题解】P1548 [NOIP 1997 普及组] 棋盘问题
  • scala中for推导式详细讲解
  • React学习 ---- 基础知识学习
  • C语言实现MATLAB中的Fir1带通滤波器
  • 微信小程序开发教程(十七)
  • 9月18日星期四今日早报简报微语报早读
  • SqlSugar 问题记录
  • 记一次宝塔+nginx+php8+thinkphp8多应用下某个应用报错404的问题 - nginx、php日志全无 - 无法追踪
  • Windows Server远程桌面(RDP)安全优化
  • 工具链过于分散会导致哪些问题
  • 【RAG】Youtu-GraphRAG
  • 惠普LaserJet Pro M203dn黑白激光打印机双面卡纸维修一例
  • 专题二 二叉树中的深度优先搜索
  • Git 多人协作(1)
  • 设计模式第三章(迭代器模式)
  • 网络原理(4):HTTP协议 -- HTTP请求 -- 首行(请求方法)
  • 密钥下发服务中心:双重验证 + 实时监控的轻量级密钥管理解决方案