-动静态库简单使用
1. 基本概念
1.1 静态库(Static Library)
静态库在编译时由链接器将库中的代码直接复制到可执行文件中。这意味着每个使用静态库的可执行文件都包含库代码的副本。
特点:
- 独立性:可执行文件不依赖于外部库文件。
- 加载速度:由于所有代码都已包含在可执行文件中,启动时无需加载额外的库文件。
- 文件大小:可执行文件较大,因为包含了库代码的副本。
1.2 动态库(Dynamic Library)
动态库在运行时由操作系统加载,可执行文件仅包含对库的引用。多个程序可以共享同一个动态库,减少内存和磁盘空间的占用。
特点:
- 共享性:多个程序可以共享同一个动态库,节省内存和磁盘空间。
- 可维护性:动态库的更新不需要重新编译依赖它的可执行文件,只需替换库文件。
- 加载速度:首次加载动态库时可能需要额外的加载时间,但后续调用可以利用操作系统的缓存机制。
2. 区别
2.1 链接时间
- 静态库:在编译时链接,库代码被静态地复制到可执行文件中。
- 动态库:在运行时链接,库代码在运行时由操作系统加载。
2.2 可执行文件大小
- 静态库:可执行文件较大,因为库代码被包含在内。
- 动态库:可执行文件较小,因为库代码在运行时加载。
2.3 更新与维护
- 静态库:如果库代码有更新,所有使用该库的可执行文件都需要重新编译。
- 动态库:只需更新动态库文件,所有使用该库的可执行文件无需重新编译即可使用新版本的库。
2.4 内存使用
- 静态库:每个使用静态库的可执行文件都包含库代码,可能导致内存中有多份相同的代码。
- 动态库:动态库代码在内存中只有一份,被多个进程共享,节省内存。
2.5 依赖性
- 静态库:可执行文件不依赖于外部库文件,部署时更简单。
- 动态库:可执行文件依赖于外部库文件,部署时需要确保库文件可用。
3. 优缺点
3.1 静态库的优缺点
优点:
- 独立性:可执行文件不依赖于外部库文件,部署更简单。
- 性能:没有运行时加载的开销,程序启动速度更快。
- 兼容性:避免了动态链接可能带来的版本不兼容问题。
缺点:
- 可执行文件较大:库代码被复制到可执行文件中,导致文件体积增大。
- 内存使用:多个进程可能包含相同的库代码,浪费内存。
- 更新困难:库代码有更新时,所有使用该库的可执行文件都需要重新编译。
3.2 动态库的优缺点
优点:
- 可执行文件较小:库代码在运行时加载,减小了可执行文件的体积。
- 内存共享:多个进程可以共享同一份动态库代码,节省内存。
- 易于更新:只需更新动态库文件,无需重新编译可执行文件。
缺点:
- 依赖性:可执行文件依赖于外部库文件,部署时需要确保库文件可用。
- 运行时开销:加载动态库需要额外的运行时开销,可能影响启动速度。
- 版本兼容性问题:不同版本的动态库可能导致兼容性问题。
4. 动静态库的实现
4.1 静态库的创建与使用
4.1.1 创建静态库(Linux)
// mylib.h
#ifndef MYLIB_H
#define MYLIB_Hvoid my_function();#endif
// mylib.c
#include "mylib.h"
#include<stdio.h>
void my_function() {printf("Hello from static library!\n");
}
2.编译源代码生成目标文件:
3.创建静态库:
ar
:归档工具,用于创建静态库。rcs
:选项,表示替换、创建和生成索引。libmylib.a
:生成的静态库文件名。
使用静态库:
-L.
:指定库文件搜索路径为当前目录。-lmylib
:链接libmylib.a
库。
4.2 动态库的创建与使用
1.创建动态库(Linux):
这里直接使用静态库的代码。
2.编译源代码生成目标文件:
gcc -fPIC -c mylib.c -o mylib.o
-fPIC
:生成位置无关代码(Position-Independent Code),对于动态库是必需的。
3.创建动态库:
-shared
:创建共享库。
4.使用动态库:
直接使用会显示出ERROR,这是因为动态库的位置没有被找到,我们需要告诉操作系统链接的位置,我们可以配置环境变量来告诉其位置。
配置好后就可以运行了,当然还有其他方法,我这里就只举了这一个方法:
希望这篇文章有助于你初步了解动静态库的使用,如果有错误还请指正。