Linux下动/静态库的打包、数据的存储、软/硬链接详解

Linux下数据的存储

文件系统:
超级块 / inode bitmap / data bitmap / inode / data

文件的存储流程
通过超级块获取到各区域的地址,然后通过节点位图(inode bitmap )和数据位图( data bitmap)在二者的区域中快速找到空闲的 inode 节点和空闲的数据块将文件数据存储到空闲的数据块中;在将文件的元信息存储到 inode 节点中。

文件的获取流程
通过文件名到父目录中找到文件所对应的目录项,得到文件的 inode 节点号;通过超级块找到 inode 节点区域,再根据 inode 节点号找到对应的数据存储块位置,进而获取文件数据。

Linux下文件的数据和文件名是分离的
文件的数据存储完毕后,还需要再这个文件的所在目录下记录这个文件的名称以及 inode 节点号。

软/硬链接

链接文件
链接是指一种在共享文件和访问它的用户的若干目录项之间建立联系的方法。当用户查看文件属性时,会看到有类似 lrwxrwxrwx 的文件,第一个字母是 l ,这类文件被称为链接文件。在 Linux 中,被链接的文件可以存放在相同或者不同的目录上。文件的链接就是为了一个文件起一个或者多个名字,有硬链接和软连接两种形式。

硬链接
默认在不带任何选项参数的情况下,用 ln 来创建硬链接。建立硬链接就是在另外的目录或者本目录中增加目标文件的一个目录项。

ln  源文件  目标文件  //硬链接是直接通过 inode 节点号去访问被链接文件

在这里插入图片描述
图中标红的 2 是链接数
链接数:即表示一个 inode 节点所对应的所有目录项,是几就对应几个。删除一个文件,文件并不会立即删除,而是先删除了目录信息,并减去一个链接数,只有当链接数为 0 时 才会真正的删除该文件

软链接
软链接类似于 Windows 的快捷方式。它实际上是一种特殊的文件。在软链接文件中,保存了被链接文件的路径。被链接文件是实际上保存数据的文件。所有的 读/写 文件的指令,当涉及到链接文件时都会沿着软链接所保存的被链接文件的路径去找到实际的被链接文件。

ln -s  源文件  目标文件 //通过所保存的被链接文件的路径去访问被链接文件

在这里插入图片描述
二则各自的特点
1> 硬 : 本质上和源文件相同,都是一个文件的名称。与源文件公用一个 inode 节点,通过自己的 inode 节点访问源文件数据。
2> 软 : 本质上是一个独立的文件,有自己的 inode 节点。文件数据中保存着 源文件的路径,通过该路径访问源文件的数据。

二者的区别
1> 删除源文件后,软链接会失效,而硬链接只是减少了一个链接数,仍旧可以继续访问源文件数据。
2> 软链接可以跨分区、硬链接则不行。
3> 软链接可以对目录创建,硬链接则不可以。

在这里插入图片描述删除源文件后仍可通过硬链接去访问源文件,只是链接数由 2 -> 1

在这里插入图片描述
删除源文件后软链接立即失效

动/静态库的打包

1.库的打包

动态库:

gcc -c -fPIC child.c(要打包的文件) -o child.o   //先将 .c 文件打包编程成 .o 文件
gcc -shared child.o(要打包的文件)-o libmychild.so //再把 .o 文件打包成动态库
//动态库的命名方式 :  lib×××.so 

静态库:

gcc -c child.c -o child.o     //解释同上
ar -cr libmychild.a child.o
//静态库的命名方式: lib×××.a

2.库的链接

动态库

有三种方式:
1. 把打包好的库文件放入指定的系统库目录下: 64位放入 /usr/lib64  32位放入 /usr/lib
2. export LIBRARY_PATH=$LIBRARY_PATH:.  //这里记得连着写,不要带空格
   //将当前库文件所在的路径添加入环境变量中, . 指的是当前路径
3. gcc main.c -o main -L./ -lmychild 
   //-L 指定链接库的路径(./ 当前路径)  -l 指定链接的库名(libmychild)

静态库

mkdir _lib    //首先创建一个文件夹
mv libmychild.a  _lib    //将生成的静态库移入 _lib 
gcc main.c -o main -L./_lib -lmychild  
//用 -L 指定静态库的所在路径(./_lib  当前目录下的 _lib)  -l 指定链接的库名(libmychild)

3.库的加载

动态库

有两种方式:
1. 把打包好的库文件放入指定的系统库目录下: 64位放入 /usr/lib64  32位放入 /usr/lib
2. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
   //将当前库文件所在的路径添加入环境变量中, . 指的是当前路径

静态库不需要加载

这是动态库的打包和使用过程:
1.创建2个函数,main 调用child的头文件
在这里插入图片描述
2.动态的库的打包和使用过程
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值