Linux动态库与静态库(一)
linux库的分析:
本质:可执行的二进制代码,可以被加载到内存执行
特点:现成、可复用、快速的学习
种类:静态库与动态库
Eg: /lib共享库和内核模块, / bin和/ sbin所需库
动态链接库的配置文件:
实际操作:
MyDfine.h:库函数头文件
MyDfine.c:库函数的实现
main.c测试我们库文件的程序文件:
静态库的生成:
编译生成目标文件:
将目标文件加到libMyDefine.a静态库文件中:
使用自己的静态库将测试文件main.c编译并链接为可执行二进制文件:
静态库的验证:
已链接到了目标文件中,函数被完整的拷贝到了执行文件中,再次执行的时候也就不需要了。
库的查看:
动态库的生成:
指令说明:-shared表明产生共享库,而-fPIC则表明使用地址无关代码
当前路径下的(mian.o)执行文件运行出错
- 没有库
- 找不到库(现在的情况)
解决:将我们自己的动态库放到/usr/lib下面
[email protected]:/usr/lib$ mv ../../sdb/wulijiao/libCode/libMyDefine.so ./
设临时变量路径:LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
动态库的验证:
库的查看:
列出文件中的符号(本质就是函数和全局变量)
U非本地库调用 、T库中定义的函数
库文件的位置:
通过系统的环境变量设置:
- 在/lib或者/usr/lib下面;
- 相关搜索路径的配置:配置/etc/ld.so.conf文件;
- 在环境变量LD_LIBRARY_PATH上添加路径。
库的比较:
静态库:
- 链接时将整个程序放到可执行程序中;
- 副本较多;
- 可执行程序生成之后便不依赖库;
- 兼容性问题
动态库:
- 程序运行时加载;
- 共享;
- 运行时加载;
- 升级方便
库的不兼容因素:
- 函数定义的改变;
- 输出数据项的改变;
- 输出函数被删除;
- 输出函数接口的改变。
环境变量的使用:
LD_LIBRARY_PATH:制定查找动态库是除默认路径外的其他路径;
常见环境变量:
HOME: 指定命令的搜索路径
PATH: 指定用户的主工作目录
LOGNAME:指当前用户的登录名
5HOSTNAME:指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的
SHELL:指当前用户用的是哪种Shell
……………
查看指令:env
库的命名:
“lib”+”函数库名称”+”.so”+主版本号+次版本号+发版本号
附:
细化知识点:
-fPIC详解:https://www.cnblogs.com/cswuyg/p/3830703.html
下一章节内容:
Nm指令 文件符号的读取
fPIC