七. 库文件的生成和使用
1.什么是库文件?
库是一种预先编译好的函数方法的集合
Linux上库文件的存放位置:/lib和/usr/lib
库分为两种:静态库和共享库
Linux上静态库标识(libxxx.a);共享库标识(libxxx.so)
Windows上静态库标识(.lib);共享库(.dll)
2.静态库的生成和使用
2.1 静态库的生成
这里有生成静态库的文件,其中add.c,max.c存放函数的实现,其中fun.h存放函数的声明。
第一步:将一会静态库需要的“.c”文件进行编译,生成“.o”文件,示例如下:
第二步:通过命令ar,将这里的“.o”文件生成静态库:
c——创建一个库文件
v——显示命令执行过程
r——向库文件中添加(.a)
t——查看静态库中间由哪些“.o”文件组成
2.2 静态库的使用
有一个测试文件“main.c”,其中具体代码为:
-L:库所在路径
-l:库的名称(开头的lib和后缀.a不要写)
3.动态库的生成和使用
3.1 共享库如何生成
这里有生成动态库的文件,其中add.c,max.c存放函数的实现,其中fun.h存放函数的声明。
第一步:将一会动态库需要的“.c”文件进行编译,生成“.o”文件:
第二步:通过gcc命令将第一步生成所有“.o”文件,生成共享库
-shared:命令gcc生成共享库
-fPIC:说明共享库使用相对地址
命令格式:gcc -shared -fPIC -o libxxx.so *.o
3.2 共享库如何使用
有一个测试文件“main.c”,其中具体代码为:
-L:共享库所在链接路径
-l:共享库的名称(注意:开头的lib和后缀.a不要写)
这时,有两个可执行文件main,a.out,运行后发现系统报错,报错:用到的共享库没有发现
原因:因为编译器跑的时候,会去/usr/lib里面找这个共享库,找不到共享库就会报错,那么只需要将使用的共享库存放/usr/lib里即可:
假设,当前路径下有同名的静态库和动态库,那么这时候,可执行文件是静态库还是动态库?
结论:如果存在同名,默认链接为动态库
4.静态库和共享库的区别
共享库的优势:因为链接共享库的可执行文件,在执行的时候才会去看共享库,所以如果修改代码,只需要修改共享库即可,可执行文件不需要修改;因此共享库所占体积比较小。
静态库的优势:比动态库执行速度快;静态库生成的可执行文件不再需要原先的静态库,运行速度快。
总结:
静态库是在链接阶段时将使用的方法包含到最终的可执行文件中;
共享库不包含,只会做标记(说明运行时需要的共享库在那,但是共享库本体是不包含的),然后在运行阶段,才会去动态链接。