当前位置:网站首页 > 编程语言 > 正文

动态库和静态库的区别(动态库和静态库的使用)



静态库和动态库是两种常见的库文件,它们在软件开发中扮演着不同的角色。它们的主要区别在于它们被链接到程序中的方式以及程序运行时的行为。

  • 静态库是一组预编译的目标文件的集合,其中包含了函数和数据,这些函数和数据可以被程序调用和使用。
  • 在编译链接过程中,静态库的内容会被完整地复制到生成的可执行文件中。
  • 静态库一旦被链接到程序中,在程序运行时就不会发生变化,因为静态库的代码被完全复制到了可执行文件中。
  • 使用静态库的优点是在程序执行时不需要外部依赖,但缺点是会增加可执行文件的大小,而且如果多个程序使用同一个静态库,会造成存储资源的浪费。
  • 动态库也是一组预编译的目标文件的集合,其中包含了函数和数据,同样可以被程序调用和使用。
  • 在编译链接过程中,动态库的引用会被放置到生成的可执行文件中,但动态库的实际代码并不会复制到可执行文件中。
  • 在程序运行时,可执行文件会在需要的时候加载动态库,并将其映射到内存中,程序可以在运行时动态地调用动态库中的函数。
  • 使用动态库的优点是减少了可执行文件的大小,因为动态库的代码是在运行时加载的,多个程序可以共享同一个动态库,节省了存储资源。
  • 动态库的缺点是在运行时需要外部依赖,如果动态库缺失或版本不匹配,程序可能无法正常运行。

1、编译源代码生成目标文件(.o)在 目录下生成 和 目标文件。   

2、打包为静态库文件(.a)

在当前目录下生成 静态库文件,其中 和 是目标文件。

参数解析:

如果需要将一个目录下的所有 文件打包为一个静态库文件,可以使用通配符 ,如下:

  • 创建静态库文件
  • :插入或更新静态库文件中的文件
  • :标准输出每个文件的名称

在需要使用静态库文件的代码文件中,需要包含头文件(如果有),并在编译时指定静态库文件的路径和名称,如下:

解释一下这个命令:

  • 添加当前目录到链接器搜索目录列表,这样链接器就能找到静态库文件。
  • :指定要链接的库文件,链接器会按照约定的命名方式()搜索链接的静态库文件,所以只需要在命令中指定库文件的名称,不需要包括 扩展名。

如果需要将静态库文件安装到系统目录下供其他程序使用,可以将库文件复制到 或 目录下,并使用 命令更新动态链接库缓存:

这样其他程序就可以直接使用 库文件了。

当然,让我们通过一个简单的示例来详细说明如何在Linux环境下创建一个C语言的静态库,并在另一个程序中使用这个静态库。我们将创建一个静态库,该库包含两个函数:一个用于计算两数之和,另一个用于计算两数之差。

首先,我们创建两个C源文件,分别实现加法和减法功能。

接下来,我们需要将这两个源文件编译成对象文件(.o文件)。在终端中执行以下命令:

这将生成 add.o 和 subtract.o 两个对象文件。

然后,我们使用ar命令将这两个对象文件打包成一个静态库文件。假设我们想命名为 libmathlib.a:

ar rcs libmathlib.a add.o subtract.o

最后,我们编译 main.c 并链接到我们的静态库。这里需要注意的是,因为我们没有安装静态库到系统标准路径,所以需要指定库的路径以及库名(去掉前缀 lib 和后缀 .a):

gcc main.c -L. -lmathlib -o my_program

这里的 -L. 表示在当前目录下寻找库,-lmathlib 指定了要链接的库名为 mathlib。

编译完成后,直接运行生成的可执行文件即可:

https://blog.csdn.net/_/article/details/my_program

输出应该是:

这样,我们就成功地创建了一个静态库,并在一个简单的程序中使用了它。

动态库(也称为共享库)与静态库不同,它在运行时被动态加载到内存中,因此可以被多个程序共享,从而减少内存的使用,同时也方便了更新和维护。下面是创建动态库的基本步骤:

1 编译源代码生成目标文件(.o)

gcc -fPIC -c file1.c file2.c -o obj/file1.o obj/file2.o

参数告诉编译器生成位置独立的代码,这是创建动态库所必需的。

2 打包为动态库文件(.so)

gcc -shared -o libmylib.so obj/file1.o obj/file2.o

这个命令将目标文件链接成一个名为libmylib.so的动态库文件。

在需要使用动态库文件的代码文件中,需要包含头文件(如果有),并在编译时指定动态库文件的路径和名称,如下:

gcc main.c -o main -L. -lmylib

参数 和 的含义与静态库的使用方式相同,都是指定库文件的路径和名称。

如果需要将动态库文件安装到系统目录下供其他程序使用,可以将库文件复制到 或 目录下,并更新动态链接库缓存:

这样其他程序就可以直接使用 库文件了。

动态库的创建和使用过程与静态库类似,但涉及到一些不同的编译和链接步骤,以确保库能够在运行时被加载。下面是在Linux环境下创建一个简单的C语言动态库,并在另一个程序中使用它的步骤。

首先,我们同样创建两个C源文件,分别实现加法和减法功能。

与静态库不同,这里我们需要直接编译成共享对象(.so)文件。使用-fPIC选项生成位置无关代码,并使用-shared选项创建动态库。

这将生成名为 libmathlib.so 的动态链接库。

接下来,我们修改之前的 main.c 文件,以便使用动态库。注意,动态库的使用在代码层面与静态库相同,区别在于编译和链接阶段。

编译时,我们需要使用 -L 来指定动态库所在的目录,以及 -l 来指定库名(不包括 lib 前缀和 .so 后缀)。但是,直接这样编译可能找不到库,因为动态加载发生在运行时,所以我们通常只编译不链接:

gcc -o my_program main.c

为了运行时能够找到动态库,有几种方法:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

设置好环境变量后,就可以运行程序了:

https://blog.csdn.net/_/article/details/my_program

输出与之前相同:

这样,我们就完成了动态库的创建和使用过程。动态库的优势在于,多个程序可以共享同一份库的代码和数据,节省内存;且更新库时不需要重新编译链接依赖它的应用程序。

到此这篇动态库和静态库的区别(动态库和静态库的使用)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 免费天气查询接口(可以免费查询天气的电话是)2026-04-23 17:54:05
  • 圈一圈的英语怎么写(一圈一圈的用英语怎么说)2026-04-23 17:54:05
  • 104规约电度报文解析(104规约电度报文解析和解析图)2026-04-23 17:54:05
  • 锁表如何解锁(表锁住了怎么解锁)2026-04-23 17:54:05
  • 返回上级目录可选用()(返回上级目录可选用)2026-04-23 17:54:05
  • awq是什么意思(aw 是什么意思)2026-04-23 17:54:05
  • 多邻国无法认证(多邻国身份认证不通过)2026-04-23 17:54:05
  • ad19铺铜规则设置(ad19铺铜步骤)2026-04-23 17:54:05
  • 查看本机本级信息(查看本机本级信息的命令)2026-04-23 17:54:05
  • 重绘图标开启了怎么玩(重绘图标开启了怎么玩游戏)2026-04-23 17:54:05
  • 全屏图片