📄前言
想必各位喜欢打电脑游戏,总是能游戏文件夹看到一种熟悉的文件后缀名——.lib的存在吧,你是否对其存在感到好奇,为何大部分游戏都离开它们呢?本文将带你充分了解它们的存在,这样一来以后如果有伙伴问起你,那么ta也会你知识的渊博感到佩服的吧。
🌺静态库
概念
静态库(Static Library)是在程序编译时被链接到执行文件中的一种库文件, 一般为代码的合集,可被多个程序共用,在unix-like环境中以 “.a” 、windows 以 “.lib” 的文件后缀名存在。
-
静态库的优点:
使用静态库的程序在运行的时候不需要依赖外部的库文件,使得程序发布不需要担心用户缺少必要的库,并且有利于程序的发布与部署。 -
静态库的缺点:
如果程序所需的代码全都整合到静态库中,这可能导致程序体积较大,浪费用户的空间。
如果静态库更新了,所有用到该库的程序都需要被重新编译,不利于维护。
静态库使用
在Linux系统中可以使用ar指令来打包.o文件,来生成静态库。
gcc -c mylib.c #生成.o文件
ar rcs libmylib.a mylib.o mylib.h #静态库生成
gcc -o test test.c -L. -lmylib
# -L:指定静态库的位置。 -l:静态库的名字,需要去除前缀lib和后缀.a
原理
静态库实质就是把代码预先编译打包成二进制文件,方便代码的管理与重用,在程序编译时就被整合到了可执行文件中,简化了编译的过程,使其成为了一个独立的单元。
🌻动态库
概念
与静态库不同,动态库在程序运行时才被加载到内存当中。在unix-like系统中通常以".so"后缀存在,在windows系统中一般以".dll"后缀存在。
使用方法
gcc -fPIC -c mylib.c #fPIC 指编译与位置无关的代码
gcc -shared -o libmylib.so mylib.o #生产动态库
gcc -o main main.c -L. -lmylib #链接动态库
运行程序时会出现像下面这样的报错,因为动态库和静态库不同,动态库的加载需要依赖系统来完成。
./main: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
解决方法:
- 直接把库文件安装到系统
cp libmylib.so /lib64
- 将库文件的软链接安装到系统
ln -s lib/libmylib.so /lib64/libmylib.so
- 修改环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/library
原理
动态库的加载由系统的动态链接器负责,在程序运行时根据环境变量或配置文件中指定的路径找到并加载库文件。动态库被加载到共享内存区,可以被多个程序共享使用,减少了内存占用并提高了代码的重用性。
📓总结
特性 | 静态库 | 动态库 |
---|---|---|
加载时机 | 编译时将代码链接至可执行文件 | 程序运行时加载 |
文件大小 | 可能较大,因为包含了所有使用到的库代码 | 较小,因为代码在应用之间共享 |
更新与维护 | 需要重新编译程序以更新库 | 可以独立于应用更新 |
运行时依赖性 | 不依赖外部库文件 | 必须确保运行环境中有正确版本的库文件 |
性能 | 启动时间更短 | 启动时需要加载库,稍慢 |