前言
库是二进制文件,是源代码文件的另一种表现形式,是加了密的源代码。
使用库的好处:
- 提高代码的重用性,提高程序的健壮性;
- 减少开发者的代码开发量,缩短开发周期;
库做好后如何使用:
- 头文件——包含了库的声明
- 库文件——包含了库函数的代码实现
库只能被其他程序调用时才能使用
静态库(.a)
静态库可以看作是一些目标代码的集合,是在可执行程序运行前就已经加入到执行码中,称为执行程序的一部分。如果此时删掉静态库文件,程序还能运行,因为它已经编译到可执行程序中去了。
静态库的制作和使用
gcc -c sourcefile1.c sourcefile2.c
//使用ar命令将-o文件打包成.a文件
ar rcs libtest.a sourcefile1.o sourcefile2.o
gcc main.c -o main -I./ -L./ -ltest
//-I头文件路径; -L库文件路径; -l库文件(去掉lib和.a)
动态库(.so)
共享库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库,规避了空间浪费问题。
动态库的制作和使用
gcc -c -fpic sourcefile1.c sourcefile2.c
//-c 生成与地址无关的编译程序,目的是为了能够在多个应用程序间共享
gcc -shared sourcefile1.o sourcefile2.o -o libtest.so
//-shared 指定生成动态库文件
gcc main.c -o main -I./ -L./ -ltest
linux加载和链接动态共享库
优缺点比较
- 静态库
- 优点
- 执行速度快,因为已经编译到执行程序中了;
- 同样,移植方便(编译后与静态库无关了);
- 缺点
- 浪费内存,每个可执行程序里面都会加载一次静态库文件
- 如果静态库更新,那么所有用到静态库的程序都需要更新
- 动态库
- 优点
- 节省内存,内存中只有一份动态库文件;
- 如果更新动态库文件,只需替换即可;
- 缺点
- 加载速度慢于静态库,动态库是程序运行过程中才去找;
- 移植性差,所有的动态库都要移植;