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

动态库和静态库

在 Linux 编程中,库是组织和共享代码的一个重要机制,主要分为静态库(Static Library)和动态库(Dynamic Library)。下面详细介绍它们的类型、使用方式、优缺点以及总结。

静态库(Static Library)

1. 什么是静态库

静态库是在编译时将所有需要的代码集成到可执行文件中的库。静态库是一组目标文件的集合,被打包为一个 .a 文件(例如 libmylib.a)。

2. 创建静态库

  1. 编写源文件(如 mylib.c):

    // mylib.c
    #include <stdio.h>
    
    void hello() {
        printf("Hello from static library!\n");
    }
    
  2. 编译源文件为目标文件:

    gcc -c mylib.c -o mylib.o
    
  3. 创建静态库:

    ar rcs libmylib.a mylib.o
    

3. 使用静态库

  1. 编写主程序(如 main.c):

    // main.c
    #include <mylib.h>
    
    int main() {
        hello();
        return 0;
    }
    
  2. 编译时链接静态库:

    gcc main.c -L. -lmylib -o main
    
  3. 运行可执行文件:

    ./main
    

4. 优缺点

  • 优点

    • 无需在运行时存在库文件,避免了库版本不兼容的问题。
    • 代码在编译时完全链接,提高运行时性能。
  • 缺点

    • 可执行文件较大,因为库中的所有代码都被复制到 可执行文件中。
    • 更新库时需要重新编译所有依赖该库的可执行文件。

动态库(Dynamic Library)

1. 什么是动态库

动态库是在运行时被加载的库,通常后缀为 .so(例如 libmylib.so)。这些库允许多个程序共享。

2. 创建动态库

  1. 编写源文件(如 mylib.c):

    // mylib.c
    #include <stdio.h>
    
    void hello() {
        printf("Hello from dynamic library!\n");
    }
    
  2. 编译为动态库:

    gcc -fPIC -shared mylib.c -o libmylib.so
    

3. 使用动态库

  1. 编写主程序(如 main.c):

    // main.c
    #include <mylib.h>
    
    int main() {
        hello();
        return 0;
    }
    
  2. 编译时链接动态库:

    gcc main.c -L. -lmylib -o main
    
  3. 通过 LD_LIBRARY_PATH 环境变量指定库路径(如果库不在系统默认搜索路径中):

    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    ./main
    

4. 优缺点

  • 优点

    • 可执行文件较小,因为代码在运行时动态加载。
    • 更新库无需重新编译所有依赖该库的程序,只需确保新库的接口与旧库兼容。
  • 缺点

    • 在运行时依赖于库的存在,如果库缺失或不兼容,程序将无法运行。
    • 加载速度较慢,相较于静态库,有一定的开销。

总结

主要区别

特性静态库动态库
文件后缀.a.so
链接方式编译时链接运行时链接
文件大小相对较大相对较小
可移植性依赖库版本通过接口兼容性提高可移植性
更新需要重新编译可以更新库而无需重新编译

选择建议

  • 使用静态库

    • 程序需要高性能,且不希望运行时有外部依赖。
    • 目标系统较为简单,库更新频率不高。
  • 使用动态库

    • 需要共享库的多个程序。
    • 需要频繁更新库,而不想重新编译所有依赖的程序。

通过了解静态库和动态库的使用以及它们的优缺点,开发者可以根据项目需求选择合适的库类型,优化程序性能和维护便利性。


http://www.kler.cn/news/367830.html

相关文章:

  • 【密码学】全同态加密张量运算库解读 —— TenSEAL
  • 计算机网络基本命令
  • JavaWeb合集18-接口管理Swager
  • Linux: Shell编程入门
  • Redis 哨兵 问题
  • 青少年编程与数学 02-002 Sql Server 数据库应用 15课题、备份与还原
  • 第五十三章 安全元素的详细信息 - Signature 详情
  • MySQL8.0.40编译安装
  • Ajax:请求 响应
  • HarmonyOS ArkTS与C++数据类型转换
  • 【前端】实操tips集合
  • 猫头虎 分享:MySQL 中 TEXT 与 LONGTEXT 数据类型详解与使用场景分析
  • ORACLE 11G WINDOWS上面搭建DG,路径对应不起作用
  • Matlab学习03-符号的替换及运算(接上一篇)
  • Python记录-字典
  • 深入解析 MySQL 数据库:防止脏读
  • 获取 Excel 文件中的所有工作表名称,可以通过 OleDbConnection 获取表架构
  • Java 中的正则表达式详解
  • qt EventFilter用途详解
  • 第 24 章 - Elasticsearch 索引生命周期管理
  • k8s知识点总结
  • HttpClient4.3 关于https 中SSL证书请求问题
  • 对角线遍历矩阵模板
  • Git使用问题汇总附带解决方法(持续更新)
  • Pr 视频效果:波形变形
  • 可编辑60页PPT | 大数据基础知识培训课件