渣渣兔 发表于 2024-6-28 07:13:42

【Linux】软硬链接和动静态库

软硬链接

软硬链接的区别:



[*]**软链接:**是一个独立文件,有自己独立的 inode 和 inode 编号。
[*]**硬链接:**不是一个独立的文件,它和目标文件利用的是同一个 inode。硬链接就是单纯的在 Linux 指定的目次下,给指定的文件新增 文件名 和 inode 编号的映射关系!
我们可以通过如下命令,创建一个文件的软硬链接:
$ ln -s 文件名 链接文件名    # 创建软连接
$ ln 文件名 链接文件名       # 创建硬链接
理解硬链接:

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个
inode。
# touch abc # ln abc def
# ls -1i
abc def 263466 abc 263466 def


[*] abc和def的链接状态完全雷同,他们被称为指向文件的硬链接。内核记录了这个毗连数,inode
263466 的硬毗连数为2。
[*] 我们在删除文件时干了两件事变:1.在目次中将对应的记录删除,2.将硬毗连数-1,如果为0,则将对应
的磁盘开释。
硬毗连数:

ll
https://img-blog.csdnimg.cn/img_convert/e4543fa94254d650addf6ea3b2c4ac0d.png
这些数字就硬链接数
硬链接本质就是该文件 inode 属性中的一个计数器 count。用来标识就几个文件名和我的 inode 建立了映射关系。简而言之,就是有自己文件名指向我的 inode (文件自己) 。
理解软链接:

我们创建一个软毗连,可以利用下面的指令:
$ ln -s 文件名 链接文件名    # 创建软连接
https://img-blog.csdnimg.cn/img_convert/5fd6643ae63f3385b36257204b2ab156.png
我们可以很明显的发现他们的inode差别
https://img-blog.csdnimg.cn/img_convert/a36c6445db05904ea83bcf6b3ea6eb21.png
我们创建一个mytest.c,内容如下:
#include <stdio.h> int main(void) {    printf("hell
o, soft link...\n");    printf("hell
o, soft link...\n");    printf("hell
o, soft link...\n");    printf("hell
o, soft link...\n");    printf("hell
o, soft link...\n");    printf("hell
o, soft link...\n");   return 0;} 步调正常运行,这里我们在 上级目次的上级目次 下直接 ./mytest.exe 就可以运行。
但是,如果我们如果想在外面运行这个步调就会很累,因为它的路径有点深:
https://img-blog.csdnimg.cn/img_convert/630a9ad4cc76a759564dfa57479349a0.png
太贫苦了,所以这里我们就可以给它建立一个软毗连,解脱双手:
$ ln -s ./lesson18/mytest.exe my.exe
https://img-blog.csdnimg.cn/img_convert/6279988f7a7667150257e079714825cc.png
直接./my.exe解放双手
https://img-blog.csdnimg.cn/img_convert/94e003d34f411f98dbdfb89d7c2eb929.png
这就很像window下的快捷桌面方式(忽略右上角的红色软件,我是爱学习的孩子)
https://img-blog.csdnimg.cn/img_convert/09c1ac7bcd326158861d12f446e72358.png
软硬链接的删除:

删除的话可以直接 rm,但是我们还是发起利用专门的 取消链接 的指令:unlink
unlike 文件名
https://img-blog.csdnimg.cn/img_convert/18c061ea6b7ac37623bbb28f1e589837.png
动静态库:

什么是动静态库?

动态库 .so:步调在运行的时才去链接动态库的代码,多个步调共享利用库的代码。
静态库 .a:步调在编译链接的时间把库的代码链接到可实验文件中。步调运行的时间将不再需要静态库
一个与动态库链接的可实验文件仅仅包罗它用到的函数入口地址的一个表,而不是外部函数所在目标文
件的整个呆板码
动态链接和静态链接:

动态链接:

在可实验文件开始运行以前,外部函数的呆板码由操纵体系从磁盘上的该动态库中复制到内存中,这个
过程称为动态链接(dynamic linking)
动态库可以在多个步调间共享,所以 动态链接使得可实验文件更小,节省了磁盘空间。 操纵体系采取假造内存 (VM) 机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
静态链接:

静态链接比较暴力,链接时间直接将目标接口的二进制代码全部链接到原文件中去,这也就是静态链接天生的文件这么大的缘故原由了;(毕竟把二进制代码copy过来了)
但是这些都是相对的,有优点就有缺点:
万一动态库路径中的库丢失损坏 ,动态链接的步调到目标位置了,过来用的时间肯定出错了;
静态链接因为编译的时间吧二进制代码考已往了,不依赖原生库,即便原库代码丢失也没事;
天生动静态库:

天生静态库:

$ ar -rc [静态库] [.o]
库的定名以 lib 开头,静态库以 .a 结尾,
https://img-blog.csdnimg.cn/img_convert/e294afb2c2fef54492d8b0e5ad95b6f5.png
此时我们就有了静态库,所谓了静态库就是曾经的源文件最终将它翻译成 .o 打包起来的东西而已。而别人用我们的库,就是在库里找到 .o 然后丢到而可实验步调里就行。
天生动态库:

动态库比静态库要复杂一些,
gcc -fPIC -c myadd.c -o myadd.o

gcc -shared -o libmyadd.so myadd.o

别在于 形成 .o 的时间是需要加上 gcc -fPIC 的,这是为了产生 与位置无关码。
https://img-blog.csdnimg.cn/img_convert/2635d86e46c9ed3cb8fa2918a320ac8b.png
利用静态库和动态库:

如今我们站在利用的人的角度,学习怎样利用静态库和动态库
利用动态库
-Ⅰ 表现我们的头文件查找的路径
-L 表现库文件搜索的路径
-l 在-L 指定的路径下你要链接哪一个库.
示例:
gcc mytest.c -o mytest -I lib-dyl/include/ -L lib-dyl/lib/ -l mymath
形成可实验步调之后,已经把需要的代码拷贝到我的代码中,运行时不依赖你的库。不需要运行时查找。
为什么动态库会有这个问题?想办法让进程找到动态库即可。
error while loading shared libraries 解决方案:
① 动态库拷贝到体系路径下 /lib64 安装。
② 通过导入环境变量的方式 —— 步调运行的时间,会在环境变量中查找自己需要的动态库路径 —— LD_LIBRARY_PATH。
③ 体系配置文件来做。
不需要运行时查找。
为什么动态库会有这个问题?想办法让进程找到动态库即可。
error while loading shared libraries 解决方案:
① 动态库拷贝到体系路径下 /lib64 安装。
② 通过导入环境变量的方式 —— 步调运行的时间,会在环境变量中查找自己需要的动态库路径 —— LD_LIBRARY_PATH。
③ 体系配置文件来做。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Linux】软硬链接和动静态库