静态库与动态库
1.什么是库
库是一段编译好的二进制代码,加上头文件就可以供别人使用。什么时候会用到库?一是某些代码需要给别人使用,但又不想暴露源代码,就需要以库的形式进行封装,只暴露出头文件;二是对于某些不需要经常修改的代码,为了减少编译的时间,就可以把它打包成库,因为库已经是编译的文件,编译的时候只需要链接,不会浪费编译时间。
链接的时候就有静态和动态的,于是就有了静态库和动态库。
2.静态库
命名规则:
例:libtest.a
①lib ②xxx - 库的名字 ③.a
制作步骤:
原材料:xxx.c 或 xxx.cpp
将生成的.c文件转成.o文件(例:gcc a.c b.c -c)
将.o文件打包:
ar rcs 静态库的名字 原材料(.o文件)
例:ar rcs libtest.a a.o b.o(ar意思是将将代码序列化)
查看静态库的内容:nm libtest.a
使用方法:
gcc test.c -I ./ -L ./lib -lmycalc -o app
-I:指定头文件的路径
-L:指定库的位置
-l:指定库的名字(去掉lib和.a)
静态库的创建过程:
3.动态库
命名规则:libxxx.so
制作步骤:
将源文件生成.o文件(例:gcc a.c b.c -c fpic)
打包:gcc -shared a.o b.o -o libxxx.so
使用方法:
gcc test.c -I ./ -L ./ -ltest -o app
-I:指定头文件的路径
-L:指定库的位置
-l:指定库的名字(去掉lib和.so)
动态库找不到文件问题解决:
使用环境变量:
临时设置:在终端输入:export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH
永久设置:
用户级别:在 ~./bashrc 文件中写入 export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH
(配置完成要重启终端,或输入 source ~./bashrc)
系统级别:在 /etc/profile 文件中写入 export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH
(配置完成输入 source/etc/profile)
修改文件列表/etc/ld.so.cache:
找到配置文件:/etc/ld.so.conf
把动态库的绝对路径加入到文件中
执行命令:sudo ldconfig -v
4.静态库和动态库的优缺点
静态库
优点:①静态库被打包到引用程序中,加载速度快
②发布程序无需提供静态库,移植方便
缺点:①占用系统资源,浪费内存(多个程序使用同个库,库都会加载到内存中,浪费资源)
②更新、部署、发布麻烦
动态库
优点:①可实现进程间的资源共享
②程序升级简单
③开发者可以控制何时加载动态库
缺点:①加载速度比静态库慢
②发布程序需要提供依赖的动态库