Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接


1.动态库

1.1 分类

  • windows下:后缀为.dll的文件为动态库
    在这里插入图片描述
  • linux下:后缀为.so,前缀为lib的文件为动态库
    在这里插入图片描述

1.2 生成动态库

命令:gcc/g++
 
必选项的命令行参数:

  • -shared==>生成动态库
  • -fPIC:生成与位置无关的代码

命令范式:

gcc/g++ [source code] -shared -fPIC -o lib[动态库名称].so

1.3 使用

本质上是想要使用动态库产生一个可执行程序;

gcc/g++ [source code] -o [可执行程序] -L [动态库所在路径] -l[动态库的名称]

测试如下:

我们首先写一个头文件,里面声明一个print()函数
在这里插入图片描述
然后test.c中实现print()函数
在这里插入图片描述
接着我们将这个test.c编译成一个动态库
在这里插入图片描述
接着我们将test.c移出当前文件夹,此时我们若想使用刚才写的print()函数就得依赖libmytest.so,若我们直接运行main.c会发现找不到‘print’
在这里插入图片描述
而此时我们就可以运行test_main
在这里插入图片描述

  • ldd+[可执行程序名称]命令:查看可执行程序依赖哪些动态库

在这里插入图片描述
当我们将生成的动态库libmytest.so移出当前文件夹,我们会看到如下结果,test_main不能运行
在这里插入图片描述

1.4 动态库配合环境变量的使用

如上图所示,当我们将生成的动态库libmytest.so移出当前文件夹,会出现’not found’,且此时test_main也不能运行,那么如何让可执行程序能够找到依赖的动态库在哪呢?

解决方案:配合环境变量LD_LIBRARY_PATH进行使用

  • LD_LIBRARY_PATH:动态库的搜索的环境变量
  • PATH:可执行程序搜索的环境变量

在这里插入图片描述

2. 静态库

2.1 分类

  • windows下:后缀为.lib的文件为动态库
  • linux下:前缀为lib,后缀为.a的文件为静态库

2.2 静态库的的生成

ar -rc lib[静态库名称].a [依赖汇编完成之后的".o"文件]
 
步骤:
 

  • 1.先将要编译静态库的代码编译到汇编为止,意味着生产力.o文件
     
  • 2.ar -rc 生成静态库

2.3 使用

使用静态库编译出一个可执行程序

gcc/g++ [source code] -o [可执行程序] -L [静态库所在路径] -l[静态库的名称]

在这里插入图片描述
注意:如果可执行程序依赖静态库进行编译成功的,会将静态库的内容直接打包到可执行程序当中

如下图所示使用ldd命令是看不到静态库的:
在这里插入图片描述

3. 静态链接和动态链接

  • 1.一个程序依赖动态库或者依赖静态库生成可执行程序的时候,动态库或者静态库是不会干扰链接方式的(静态链接和动态链接)
  • 2.在编译可执行程序,使用gcc/g++编译的时候,默认不增加命令行参数"-static",则为动态链接。反之,则为静态链接

4. 文件系统(针对磁盘而言)

4.1 ext2文件系统:

在这里插入图片描述
上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改

  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息
  • 块位图(Block Bitmap):描述每一个块的使用情况,使用比特位为1,未使用比特位为0
  • inode位图(inode Bitmap):描述inode节点的使用情况,inode Bitmap描述inode table当中哪一个inode节点被使用,哪一个inode节点没有被使用
  • inode节点:就是用来描述文件存储的信息,以及文件的元信息

4.2 存储数据的逻辑

(1) 从block bitmap当中查找空闲的block块,将文件分成不同的块存储在不同的block当中
(2) 从inode bitmap当中查找空闲的inode节点,将文件信息保存在inode当中,文件信息包含:文件在那些block块当中存储的文件名称,文件大小,文件权限,文件访问时间,文件修改时间,文件修改属性时间,文件的拥有者,文件所属组
(3)将文件的名称和inode节点号,作为目录项保存下来

4.3 获取文件的逻辑

(1)通过目录项当中的文件名称找到对应的inode节点号
(2)通过inode节点号,找到对应的inode系欸但,再通过inode节点找到文件的元信息
(3)通过文件元信息,找到文件存储的block块,将文件内容组合起来
(4)展示给用户,文件的元信息以及文件内容
在这里插入图片描述
在这里插入图片描述

5.软硬链接

5.1 软连接

  • 软连接就是给文件创建了一个快捷方式

如何创建一个软连接

ln -s [原文件] [要创建的软连接文件]

在这里插入图片描述

  • 修改源文件会影响软链接文件,修改软链接文件会影响源文件

在这里插入图片描述

  • 删除软连接文件,源文件不会受到影响,但是删除源文件的时候一定要把软连接文件也删除掉,不然会有如下图所示情况

在这里插入图片描述

5.2 硬链接

  • 硬链接相当于文件的一个备份(拷贝)

如何创建一个硬链接文件

  • ln [源文件] [硬链接文件]
    在这里插入图片描述
  • 删除源文件对硬链接文件没有影响
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值