Linux--动静态库的原理和使用详解

本文介绍了Linux系统中动态库与静态库的概念、原理以及使用方法。通过深入讲解动态库与静态库的区别和优劣势,帮助读者更好地理解并选择合适的库类型来进行软件开发。

动态库和静态库的概念

  1. 动态库(Dynamic Link Library,简称DLL):在运行时加载的库文件,不会被复制到可执行程序中,可以被多个程序共享使用。
  2. 静态库(Static Library):在编译时被链接到目标代码中的库文件,会被复制到可执行程序中,每个程序都有自己的副本。
    在这里插入图片描述

动静态库的使用和制作

具体步骤

  1. 创建源代码文件:首先,编写你的库的源代码文件,可以是一个或多个源码文件。这些文件包含了你想要封装在库中的函数、变量和其他定义。

  2. 编写头文件:创建一个头文件(通常以.h作为文件扩展名),用于存放库的接口声明。在头文件中定义公共的结构、函数原型和常量。

  3. 编译源代码文件:使用合适的编译器对源代码文件进行编译,生成目标文件(通常以.o作为文件扩展名)。例如,在Linux上可以使用gcc命令进行编译,如:gcc -c file1.c file2.c

  4. 创建静态库:将所有的目标文件打包成一个静态库文件(通常以.a作为文件扩展名)。使用ar命令创建静态库,如:ar rcs libyourlibrary.a file1.o file2.o。其中,'libyourlibrary.a’是静态库的名称,'file1.o’和’file2.o’是目标文件。

  5. 创建动态库:将所有的目标文件编译成一个动态链接库文件(通常以.so作为文件扩展名)。使用合适的编译器和链接器创建动态库,如:gcc -shared -o libyourlibrary.so file1.o file2.o。其中,'libyourlibrary.so’是动态库的名称,'file1.o’和’file2.o’是目标文件。

  6. 使用静态库:在编译可执行程序时,将静态库链接到程序中。例如,在使用gcc编译时添加’-L’选项指定库的路径,'-l’选项指定库的名称,如:gcc -o myapp main.c -L/path/to/library -lyourlibrary

  7. 使用动态库:在编译可执行程序时,可以使用静态方式链接动态库,也可以在运行时动态加载动态库。在使用gcc编译时添加’-L’选项指定库的路径,'-l’选项指定库的名称,如:gcc -o myapp main.c -L/path/to/library -Wl,-rpath,/path/to/library -lyourlibrary

实例操作

在这里插入图片描述
在这里插入图片描述

前章内容:重定向和文件缓冲

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建静态库

在这里插入图片描述

创建动态库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

动静态库同时存在

在这里插入图片描述
在这里插入图片描述

动态库与静态库的区别

  1. 文件大小:动态库较小,静态库较大。
  2. 内存占用:动态库在运行时加载,不会占用程序的内存;而静态库会被完全加载到程序的内存中。
  3. 载入速度:动态库的载入速度较慢,因为需要在运行时进行加载和链接;而静态库的载入速度较快,因为已经被编译并链接到程序中。
  4. 更新与维护:动态库的更新只需替换库文件,不需要重新编译程序;而静态库的更新需要重新编译整个程序。
  5. 可重定位性:动态库可以在不同的系统上使用,因为动态链接器会解析库的依赖关系;而静态库需要重新编译适配不同的系统。

动态库的加载

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

动态库与静态库的选择

  1. 动态库适合需要共享使用的库,减少内存占用
  2. 静态库适合需要独立部署的程序,减少运行时的依赖
  3. 根据项目需求和系统环境特点综合考虑选择。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-28 17:56:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-28 17:56:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-28 17:56:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-28 17:56:02       20 阅读

热门阅读

  1. vue组件间通信详解

    2024-03-28 17:56:02       20 阅读
  2. 语言模型transformers调用部分 (To be continue...

    2024-03-28 17:56:02       19 阅读
  3. C语言:指针进阶

    2024-03-28 17:56:02       26 阅读
  4. Python入门级题目及答案

    2024-03-28 17:56:02       18 阅读
  5. 利用python脚本,根据词条爬取百度图片(爬虫)

    2024-03-28 17:56:02       18 阅读
  6. linux内核网络“每日读书”

    2024-03-28 17:56:02       19 阅读
  7. 【OpenGL实践06】如何读入模型文件obj数据

    2024-03-28 17:56:02       19 阅读
  8. OpenAI奥特曼豪赌1.42亿破解长生不老

    2024-03-28 17:56:02       24 阅读
  9. lua 判断字符串是否包含指定字符

    2024-03-28 17:56:02       19 阅读