一、库文件
库是一组预先编译好的函数方法的集合
Linux上库文件的存放位置: /lib和/usr/lib
库分为两种:静态库和共享库
Linux上静态库标识(libxxx.a),共享库(libxxx.so)
Windows上静态库标识(.lib),共享库(.dll)
二、静态库的生成和使用
1)静态库的生成
这里有生成静态库的文件,其中add.c,max.c存放函数的实现,其中fun.h存放函数的声明
如何生成静态库?
第一步:将静态库需要的".c"文件进行编译,生成"".o"文件,示例如下:
第二步:通过命令ar,将静态库需要的的“.o"文件生成静态库
ar命令:
- c 创建一个库文件
- v 显示命令执行过程
- r 向库文件中添加方法(.a)
- t 查看静态库中由哪些“.o”组成
2)静态库的使用
一个测试文件“main.c”,具体代码为:
我们也可以将max.c 和add.c加入到程序后面调用
但是我们也可以使用静态库解决这一问题
- L:库所在路径
- l :库的名称(开头的Lib和 .a不需要写)
三、共享库的生成与使用
1)共享库如何生成
这里有生成共享库的文件,其中add.c,max.c存放函数的实现,其中fun.h存放函数的声明
第一步:将共享库需要的".c"文件进行编译,生成"".o"文件,示例如下:
第二步:通过gcc命令将第一步生成的所有“.o”文件,生成共享库
命令:
- -shared 命令gcc生成共享库
- -fPIC 说明共享库使用相对地址
命令格式: gcc -shared -fPIC -o libxxx.so *.o
两种方式生成的静态库没有区别
2)共享库如何使用
- -L:共享库所在的链接路径
- -l :共享库的名称(libxxx.so,lib和.so不要写,只写xxx)
测试文件main.c
现在生成了两个可执行文件main,a.out,现在运行
原因如下:因为编译器运行时,会直接去/usr/lib里面找共享库,找不到就会报错
解决方法:我们可以将共享库在/usr/lib中拷贝一份
假设,当前路径下有同名的静态库和动态库,那么这个时候,可执行文件用的是静态库还是动态库?
结论:如果存在同名,默认链接的是动态库
四、静态库和共享库的区别
共享库的优势:因为链接共享库的可执行文件,在执行的时候才会去看共享库,所以如果修改代码,只需要改共享库即可,可执行文件不需要修改。
静态库的优势:比动态库执行速度快,静态库生成的可执行文件不再需要原先的静态库
总结:
- 静态库是在链接时将用到的方法包含到最终生成的可执行程序中
- 共享库不包含,只做标记(说明运行时需要的共享库在哪,但是共享本体是不包含的),在运行程序时,才动态加载
五、如何查看可执行文件用到哪些共享库