库的定义
库就是把常用的函数的目标文件打包在一起,提供函数调用的接口,以便后续的使用或者发布,库的本质是可执行程序的二进制形式。
在不同的操作系统中,库不可兼容,在Linux的平台下,静态库文件的后缀是 .a ,动态库的后缀是 .so;在window的平台下,静态库文件的后缀是 .lib ,动态库的后缀是 .dll。
在Linux操作系统中,库文件存放在/usr/lib目录下,头文件存放在/usr/include目录下。
库的分类
库分为静态库和动态库,二者最大的区别是代码被载入的时刻不同。
静态库
静态库在程序编译时会被连接到目标代码中。
优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快
缺点:静态库中的代码复制到了程序中,因此体积较大;且静态库升级后,程序需要重新编译链接
动态库
优点:程序在执行时加载动态库,代码体积小;程序升级简单;不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
缺点:运行时还需要动态库的存在,移植性较差。
库的制作
静态库的制作
1.将源文件编译成生成目标文件
gcc -c xxx.c -o xxx.o
2.创建静态库用ar命令,将.o转换成.a
ar crs lib库名.a xxx.o
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a
3.测试使用静态库
gcc main.c -L.库的路径 -l库名
动态库的制作
1.用gcc创建共享库
gcc -fPIC -c xxx.c -o xxx.o
fPIC的含义是创建与地址无关的编译程序(就是不和路径进行关联)。
gcc -shared -o lib库名.so xxx.o
2-测试动态库使用
gcc main.c -L. -l库名
运行时报错./a.out: error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directory
这是因为系统会默认从/usr/lib目录下查找库文件,所以只需将库文件移动到该目录下即可。