目录
库是什么
静态库和共享库
库的链接
优缺点
查看使用的库
制作库
制作静态库
静态库的使用
制作共享库
共享库的使用
静态库和共享库的区别
库是什么
库就是预先编译好的方法的集合
.h中是库函数的声明,库函数的实现在库中,如:printf库函数的实现在libc.so(c动态库)中
因为库函数不用修改,只用链接就可以,减少编译消耗时间,所以库中的文件都是.o文件
静态库和共享库
库分为静态库和共享库。静态库为libxx.a,共享库为libxx.so, xx是库的名字,现在基本上都使用共享库
Windows上静态库为.lib,动态链接库为.dll
库的链接
静态库将库中的那些方法包含在可执行程序中
共享库标记程序中用到共享库的方法,运行程序时动态链接,即运行程序时寻找库。
优缺点
静态库的
优点:如果计算机上没有这个静态库,程序依旧可以运行,因为程序已经包含了这个库;
缺点:程序体积较大,磁盘到内存空间都被占了。
共享库的
优点:程序体积较小,一份库放在内存中大家都可以共享使用;
缺点:1.计算机上要有使用了的所有动态库,如果运行程序时找不到这个库,则运行错误。2.运行程序时装载库,程序可能变慢。
查看使用的库
静态库成为程序的一部分了,所以无法查看
共享库:ldd 程序名
可以看到链接了三个库,两个是linux默认的,还有一个c库(用到了printf)
制作库
一些文件的位置:
头文件 /usr/include
库文件 /usr/lib,/lib
可执行程序 /usr/bin,/bin (sbin是管理员用的命令,bin都可以使用)
例如pwd,在bin中可以直接使用,而不用把它的绝对路径输出出来
制作静态库
1.将所有.c编译成.o
2.使用ar命令将所有.o程序打包到一个库中
c创建库,r将方法添加到库中,v显示过程(可有可无)
静态库的使用
使用时,只用传头文件.h,编译链接使用-L、-l告诉main程序用哪个库
-L指定库的位置,-l指定库的名称(不加前缀lib和扩展名.a)中间没有空
如果不用-L-l,编译会报错:找不到这个方法
但是如果库和头文件在标准目录下/usr/lib和/usr/include,可以省略-L
编译后删掉库依旧可以再次执行
制作共享库
第一步与静态库一样
第二步使用gcc命令将第一步编译的所有.o文件生成共享库
共享库的使用
编译跟静态库是一样的
编译完不能直接运行(./main),因为他找不到动态库,运行时找库只在标准位置(/lib或/usr/lib等)中寻找,编译时是把路径告诉给gcc链接的位置,运行时不在那个位置找
两个方法解决此问题:
- 用环境变量告诉main在某个位置装载库(多用于测试)
echo $LD_LIBRARY_PATH
LD_LIBRARY_PATH = 库的位置 //位置赋值
export LD_LIBRARY_PATH //做成环境变量
这样把库的位置放到PATH中
- 把库挪到标准目录下(优)
在Ubuntu中/usr/lib跟/lib是一个位置
静态库和共享库的区别
静态库在链接时将用到的方法包含到最终生成的可执行程序中,而共享库不包含,只做
标记,在运行程序时,才动态加载。
就算删除了静态库,程序也可以执行
更新库时静态库必须重新编译,而共享库新库可以直接覆盖旧库
理论上共享库比静态库小