动态库的制作
命名规则:
Linux:lib***.so
lib:前缀(固定)
***:库的名字,自己起
.so:后缀(固定)
在Linux下是一个可执行文件
Windows:lib—.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)命令检查动态库依赖关系
- 如何定位共享库文件呢?
当系统加载可执行代码的时候,能够知道其依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so完成,它先后搜索elf文件的DT_RPATH段->环境变量LD_LIBRART_PATH->/etc/ld.so.cache文件列表->/lib/,/usr/lib目录找到库文件后将其载入内存。
解决动态库加载失败问题
方法一:配置环境变量,在终端中配置,只是临时的,永久级别配置需要用户级别和系统级别配置
方法二:环境变量,用户修改
vim界面中:shift+G-到最后一行,O向下插入一行,Esc+:wq,保存并退出
Esc+dd:删除选中的某一行
方法三:环境变量,系统修改
方法四:/etc/ld.so.cache文件列表
sudo vim /etc/ld.so.conf 将lib目录复制进该文件;sudo ldconfig更新文件配置;
方法五:/lib/,/usr/lib目录,不推荐使用!本身包括许多系统自身的库文件,防止误操作,重名!
静态库和动态库的对比
程序编译成可执行程序的过程
静态库制作过程
动态库制作过程
库非常小时,建议用静态库;库非常大时,建议用动态库
静态库的优缺点
优点
- 静态库被打包到应用程序中加载速度快
- 发布程序无需提供静态库,移植方便
缺点
- 消耗系统资源,浪费内存
- 更新、部署、发布麻烦
动态库的优缺点
优点
- 可以实现进程间资源共享(共享库)
- 更新、部署、发布简单
- 可以控制何时加载动态库
缺点:
- 加载速度比静态库慢
- 发布程序时需要提供依赖的动态库