静态库的使用(libxxx.a)
将lession04的文件复制到lession05中
lib里面一般放库文件 src里面放源文件。
将.c文件转换成可执行程序
gcc main.c -o app
main.c当前目录下没有head.h
gcc main.c -o app -I ./include
利用-I 和head所在的文件夹,找到head。
main.c用到了库里面的东西,但是没有找到,因此需要使用
gcc main.c -o app -I ./include -l calc -L ./lib
在./lib文件夹中 找calc库文件
回顾静态库制作和使用
目前文件夹中具有头文件、主函数文件、函数源文件。
先把函数源文件编译汇编成.o文件
gcc -c add.c div.c mult.c sub.c
由于头文件在include文件夹里 需要在后面加上 -I ../include/
然后将.o文件打包制作成静态库
ar rcs libsuanshu.a add.o div.o mult.o sub.o
ar rcs [库名] [*.o]
并且将静态库移动到库文件夹中
mv libsuanshu.a ../lib
编译main.c 为suanshu程序
gcc main.c -o suanshu -I ./include -l suanshu -L ./lib
-o [输出文件名] -I [头文件路径] -l [库名称] -L[库文件路径]
动态库(共享库)的制作(libxxx.so)
命名规则:
Linux:libxxx.so
Windows:libxxx.dll
gcc 得到.o文件,得到和位置无关的代码
gcc -c -fpic/-fPIC a.c b.c
gcc 得到动态库
gcc -shared a.o b.o -o libcalc.so
动态库的使用
加载共享库时出现了错误,不能打开共享文件,虽然制定了库的目录,但找不到这个动态库。
动态库实现原理
静态库进行GCC链接时,会把静态库中的代码打包到可执行程序中。
动态库进行GCC链接时,动态库的代码不会打包到可执行程序中。
程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库依赖关系。
1.通过配置动态库环境变量解决main找不到动态库
临时环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib
lld可以找到动态库的依赖关系,可以运行main。
重新打开终端,环境变量就失效了,这个配置是临时的。
用户级别上配置
可以在用户级别上配置,编辑~/.bashrc,在文件最后加上
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib
重启终端后,main文件仍可以找到动态库。
在.bashrc中删除最后一句,source ~/.bashrc,回到main的位置,可以发现main又找不到动态库了
系统级别上配置,需要root权限
编辑/etc/profile,在文件最后加上
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib
2.通过ld.so.cache文件列表
利用sudo编辑ld.so.conf文件,在里面加上动态库的路径,再用sudo ldconfig更新。
3.将动态库文件放入/lib/ /usr/lib目录中
什么时候使用动态库静态库。
文件比较小使用静态库,文件比较大使用动态库。
静态库优缺点
优点:静态库被打包到应用程序中加载速度快。发布程序无需提供静态库,移植方便。
缺点:消耗系统资源,浪费内存,更新、部署、发布麻烦。
动态库优缺点
优点:可以实现进程间资源共享(共享库),更新、部署、发布简单,可以控制何时加载动态库。
缺点:加载速度比静态库慢,发布程序时需要提供以来的动态库。
学习进度
Linux系统编程入门 02:34:20