目录
理解软硬链接
硬链接
我们知道,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个 inode。
硬链接指令:ln 【目标文件名】 【硬链接文件名】
- abc和def的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数,inode 1184371 的硬连接数为2。
- 我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
软链接
硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,在shell中的做法
软链接指令:ln -s 【目标文件名】 【硬链接文件名】
特征
- 软链接是一个独立的文件,因为有独立的inode number
- 软链接的内容:目标文件所对应的路径字符串(类似于Windows的快捷方式)
- 硬链接不是一个独立的文件,因为你没有独立的inode number,你用的是目标文件的inode
- 硬链接是一个文件名和inode的映射关系,建立硬链接,就是在指定目录下添加一个新的文件名和inode number 的映射关系!
- 属性中有一列硬链接属性,相当于文件的磁盘及引用计数:有多少个文件名字符串通过inode number指向我。
- 我们得知道,定位一个文件只有两种方式:1.通过路径(软链接)2.直接找到目标文件的inode(硬链接)。最终还是要通过inode number的。
软硬链接有什么用
软链接的最大用处就是方便我们用户使用目标文件。
硬链接的用处有以下几点:
- 构建Linux的路径结构,让我们可以使用. .. 来进行路径定位。任何一个目录,刚开始新建的时候,引用计数一定是2,目录A内部,新建一个目录的时候会让目录A的引用计数自动+1,我们要确定一个目录内部有几个目录可以用A的硬链接数-2.
- Linux系统中,不允许给目录建立硬链接,避免形成路径环绕,而 . .. 能存在是因为它文件名是固定的,所有系统指令在设定的时候几乎都能知道. .. 是干什么的。
- 我们的硬链接还可以用来做文件的备份
动态库和静态库
静态库与动态库
- 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
- 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
- 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
- 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
- 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚 拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
程序案例
我们写了如下的几个简单的文件,两个头文件两个.c文件,一个主函数.c文件。每个头文件只有一个加法/减法功能,.c对应的实现。
生成静态库
我们先将方法库汇编成.o文件,然后将他们两个打个包生成静态库。
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表
t:列出静态库中的文件 v:verbose 详细信息
如图所示我们的测试文件就链接好了。
-L 指定库路径 -l 指定库名(去掉文件前缀lib和后缀.a就是库文件名)
测试目标文件生成后,静态库删掉,程序照样可以运行。
这就是我们前面说的编译的时候会把静态库链接到可执行文件中,所以我们就不再需要静态库了。这也是为什么我们的a.out这个可执行程序这么大。后面我们使用动态库就会变小了。
库搜索路径
- 从左到右搜索-L指定的目录。
- 由环境变量指定的目录 (LIBRARY_PATH)
- 由系统指定的目录(/usr/lib )(/usr/local/lib)
生成动态库
- shared: 表示生成共享库格式
- fPIC:产生位置无关码(position independent code)
- 库名规则:libxxx.so
使用动态库
编译选项
- l:链接动态库,只要库名即可(去掉lib以及版本号)
- L:链接库所在的路径.
动态库不像静态库,我们把动态库移到另一个目录下程序就运行不了了。
运行动态库
- 拷贝.so文件到系统共享库路径下, 一般指/usr/lib
- 更改 LD_LIBRARY_PATH
- ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新
- 建立软链接
- 修改配置文件
Linux理解软硬链接及动静态库
最新推荐文章于 2025-05-24 17:54:21 发布