论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
运维.售后
›
运维.售后
›
【Linux】动态库、静态库
【Linux】动态库、静态库
反转基因福娃
金牌会员
|
2024-11-3 07:02:57
|
显示全部楼层
|
阅读模式
楼主
主题
856
|
帖子
856
|
积分
2568
1. 概念
库的本质就是.o文件的集合。
静态库:是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比力大,但在运行时也就不再必要库文件了,其后缀名一般为“.a”。
动态库:是指在编译链接时并没有把库文件的代码加入到可执行文件中,而是在步伐执行与运行时链接文件加载库,这样可以节省体系的开销,动态库一般后缀名为“.so”,完成了链接之后,gcc 就可以生成可执行文件。
2. 制作静态库
预备工作
在制作库时,通常要将源文件潜伏起来,只提供对应的.o文件,而且必要对.o文件进行打包
静态库库名规则:libxxx.o
打包的命令: `ar -rc lib库名.a 要打包的.o文件`
其中ar = archive(存档),r = replace,c = create;如果库中已经存在同名的.o就进行替换,没有则创建。
复制代码
将来,我要把库给别人用,只必要把头文件给他,把库文件给他即可。
2.1 将库安装到体系
那能不能将我自己写的库安装到体系里呢? - -直接拷贝即可。
现在,我就直接可以使用我自己写的库了
但是链接时为什么出错呢? - -没有指定库
选项 -l :引入指定名称的第三方库
2.2 将库与头文件直接拷给用户
但是此时链接又找不到库了
选项:-L 库路径 - l 库名
此时,该种方式也就能跑起来了。
2.3 使用带路径的库
此时,我们就可以将生成的库mystdc交给别人了。那别人怎么用呢?
选项:-I,指定头文件的路径
总结
-l:指定库名
-L:指定库地点的路径
-I:指定头文件的路径
3. 制作动态库
动态库的库名规则:libxxx.so
在我们使用gcc编译时,默认形成的是可执行文件,当前如果想形成库,必要加选项 -shared
gcc -o 目标库 源文件 `-shared`
复制代码
在形成动态库所必要的.o文件时,必要设置与位置无关码选项 -fPIC
gcc `-fPIC` -c .o .c
复制代码
此时,我们的动态库就做好了。如果想给用户使用,仍旧可以用静态库中使用的三种方式。
下面使用将库拷贝到体系中
此时别人就可以使用了
对于动态库,我们可以使用下令 ldd 可执行文件名,查询一个可执行步伐依靠哪些库
动态库删除后步伐就不能跑了
为什么用户使用output后的动态库,编译器可以编过,但是运行不了可执行了呢?
在gcc编译时,指定各种选项,是告诉编译器去哪里找;在运行时,操作体系要加载步伐,但是它找不到动态库了,因此报错了。
所以,动态库是必要加载的
那么如何给体系指定路径,让库被加载呢?
直接将动态库拷贝到体系中
在体系路径下创建动态库的软毗连
链接名肯定要和动态库的名字雷同
将自己的库路径添加到环境变量列表中
此时对第二种方式有一个疑问:为什么你体系默认就去lib64中找呢?
因为linux中,体系查找动态库,体系存在一个环境变量 LD-LIBRARY_PATH
那么此时,我们就可以将自己库的路径导进环境变量中!
设置/etc/ld.so.conf.d/,ldconfig更新
将库路径写在 etc/ld.so.conf.d目录下,该目录下存放的是一系列的设置文件,这些设置文件用于指定体系的共享库(动态链接库)搜刮路径,这些设置文件通常以.conf作为文件后缀。
如果同时给应用步伐提供动态库和静态库,它会使用哪一个呢?
gcc/g++优先使用动态库
如果非得使用静态库,可在编译选项中加上-static
如果强制静态链接,必须提供对应的静态库
如果只提供静态库,但链接方式是动态链接的,gcc/g++没得选,只能阵对你的.a局部性接纳静态链接
4. 明白动态库
因为动态库也都是文件,那么在运行时,也会被加载到内存中。
但进程是如何看到加载的动态库呢? - -经过页表的映射,将加载到内存的动态库的地点映射到进程地点空间中的共享区
多个进程依靠同一个动态库时,动态库也只必要加载一份;仅必要修改其它进程页表中动态库的映射即可,所以动态库才叫做共享库。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
反转基因福娃
金牌会员
这个人很懒什么都没写!
楼主热帖
设计模式---组合模式
Spark快速上手(4)Spark核心编程-Spark ...
如何将鸿蒙(harmonyOS)系统退回安卓 ...
写了这么久Java项目,是否还记得你的第 ...
拿到12家offer,想给大家分享一下面试 ...
【Unity3D】Transform组件
软件工程经济学第一章
年度重磅!《2022华为开发者宝典》多元 ...
需求太多处理不过来?MoSCoW模型帮你 ...
【渗透攻击】PowerShell与Shell 有什么 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表