【转】什么是lib,什么是dll,什么是.a,什么是.so,什么是静态库,什么是动态库

本文详细解析了静态库和动态库的工作原理及优缺点,阐述了它们在编译链接阶段的不同,以及如何影响程序的运行和维护。作者强调了深入理解库文件的重要性,尤其是在软件架构设计和移植过程中。

https://www.cnblogs.com/general001/articles/3567446.html

所谓静态库,就是在静态编译时由编译器到指定目录寻找并且进行链接,一旦链接完成,最终的可执行程序中就包含了该库文件中的所有有用信息,包括代码段、数据段等。所谓动态库,就是在应用程序运行时,由操作系统根据应用程序的请求,动态到指定目录下寻找并装载入内存中,同时需要进行地址重定向。 win32平台下,静态库通常后缀为.lib,动态库为.dll linux平台下,静态库通常后缀为.a,动态库为.so 从本质上来说,由同一段程序编译出来的静态库和动态库,在功能上是没有区别的。不同之处仅仅在于其名字上,也就是“静态”和“动态”。 由上面的介绍不难看出,相对于动态库,静态库的优点在于直接被链接进可执行程序中,之后,该可执行程序就不再依赖于运行环境的设置了(当然仍然会依赖于 CPU指令集和操作系统支持的可执行文件格式等硬性限制)。而动态库的优点在于,用户甚至可以在程序运行时随时替换该动态库,这就构成了动态插件系统的基础。 具体使用静态库和动态库,由程序员根据需要自己决定。

另外,需要说明的一点是,从底层实现上,动态库的效率可能会比静态库稍差一点点,注意,这里用了“可能”二字,具体差不差,还得看写程序的人。之所以可能会差,主要原因在于,程序总无法直接调用动态库中的函数符号,而只能通过调用操作系统的runtime enviroment接口来动态载入某个函数符号,同时获得该函数符号在内存中的地址,将其保存为函数指针进行调用,这就在函数调用时增加了一次间接寻址的过程。

还是那句话,希望大家都能深入opencv源码库中去,不要仅仅满足于会调几个API,这样很难对自己有提高的。深入进去读源码,看看人家是怎么组织软件架构的,怎么划分模块的。实际上,如果任何一个软件体系的层次模块划分足够清晰和灵活的话,移植性就不会成为很大的问题,无非就是字节对齐、部分算法利用特殊指令集进行优化之类的,这些改动应该仅限于局部调整,而不用全盘重写的。软件架构,很重要的一条就是open-close 原则,要清楚哪些是可变的哪些是不可变的。就像上面,将来会发生变化的算法,就可以考虑放到动态库中,以免将来程序统一全部升级。

另外,在移植软件的过程中,保持接口不变是有多重含义的,我们通常知道的是:

  1. 函数、变量名称不变
  2. 函数、变量语法属性不变(比如一个声明为C形式的函数,必须以C形式对其进行调用,否则由于重载特性会找不到函数名)
  3. 函数返回值类型不变
  4. 函数参数个数不变
  5. 函数参数类型不变

这里,常常被人们遗忘的,也是最重要的一点是:

保持函数语义不变

这是什么意思,对于一段程序,除了词法分析、语法推导之外,还有很重要的一条就是语义分析。简单来说,对于一个函数,必须保持移植前后,该函数的返回值含义不变、参数含义不变、函数内部行为的外部表现不变。忽视其中任意一条,都会造成上层应用程序的行为变为未定义,从而移植失败。

<think>我们正在讨论静态库文件扩展名`.a`的含义。根据提供的引用内容,我们可以总结如下:1.引用[2]明确指出:在Linux平台下,静态库通常后缀为`.a`,动态库为`.so`。2.引用[1]和[3]解释了静态库的本质:静态库是一组目标文件(`.o`或`.obj`文件)的集合,经过压缩打包后形成的文件。因此,`.a`文件的全称是**Archive**(归档文件)。这是因为静态库实际上是一个归档文件,它将多个目标文件打包在一起,以便在链接时使用。###详细解释:-**Archive的含义**:归档是指将多个文件组合成一个文件的过程。在Unix/Linux系统中,`ar`命令(Archiver)用于创建和操作这种归档文件。-**文件格式**:静态库文件(`.a`)本质上是一个由`ar`工具生成的归档文件,其中包含多个编译后的目标文件(`.o`)。例如:```basharrlibmath.aadd.osub.o#将add.o和sub.o打包到libmath.a中```-**链接过程**:在编译程序时,链接器(如`ld`)会从静态库中提取需要的目标文件,并将其直接嵌入到最终的可执行文件中[^3]。###对比动态库:|库类型|扩展名|全称|特点||----------|--------|--------------------|--------------------||静态库|`.a`|**Archive**|链接时嵌入可执行文件||动态库|`.so`|**SharedObject**|运行时动态加载|###示例:创建静态库的过程:```bash#编译目标文件gcc-cadd.csub.c#打包为静态库arrcslibmath.aadd.osub.o#rcs选项:r(替换)c(创建)s(索引)```>注意:`.a`文件不是压缩文件,而是按特定格式组织的归档文件,可通过`artlibmath.a`查看内容。###相关问题1.静态库(`.a`)和动态库(`.so`)在程序运行机制上有何本质区别?2.为什么使用静态库会导致可执行文件体积增大?3.`ar`命令中的`rcs`选项分别代表什么含义?4.如何查看静态库中包含哪些目标文件?</think>### 静态库文件 `.a` 的缩写含义解析 #### 1. **`.a` 的全称** `.a` 是 **Archive**(归档文件)的缩写[^2]。 - **核心含义**:表示这是一个**目标文件的归档集合**(多个 `.o` 文件打包压缩后的单一文件)。 - **技术本质**: > "静态库可以简单看成是一组目标文件.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件"[^1]。 #### 2. **设计原理** | 关键概念 | 说明 | |-------------------|----------------------------------------------------------------------| | **组成单元** | 由多个编译后的目标文件(`.o`)组成 | | **打包工具** | 通过 `ar` (Archiver) 命令创建[^1] | | **链接行为** | 在编译时**直接嵌入**可执行文件(与动态库 `.so` 的本质区别)[^3] | | **文件标识** | `.a` = 归档文件,`.so` = 共享对象(Shared Object)[^2] | #### 3. 文件格式对比 | 平台 | 静态库扩展名 | 动态库扩展名 | 核心差异 | |-----------|--------------|--------------|------------------------------| | **Linux** | `.a` | `.so` | 链接时嵌入 vs 运行时加载 | | **Windows**| `.lib` | `.dll` | 相同机制,不同命名 | #### 4. 操作示例 **创建 `.a` 文件:** ```bash # 编译目标文件 gcc -c add.c sub.c # 生成 add.o, sub.o # 打包为静态库 ar rcs libmath.a add.o sub.o # r(替换) c(创建) s(生成索引) ``` **查看归档内容:** ```bash ar t libmath.a # 输出:add.o sub.o ``` #### 5. 技术特性 - **优点**: - 无需运行时依赖 - 执行效率高(代码直接嵌入) - **缺点**: - 导致可执行文件体积增大[^3] - 库更新需重新编译整个程序[^3] > 💡 **命名规范**: > `libmath.a` = `lib`(库前缀)+ `math`(库名)+ `.a`(归档标识) ### 相关问题 1. 为什么静态库更新后需要重新编译可执行文件?[^3] 2. `ar` 命令中的 `s` 选项(生成索引)有什么作用? 3. 动态库(`.so`)的 "Shared Object" 具体指什么? 4. 如何解决静态库导致的可执行文件体积膨胀问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值