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

文章目录:

  • 1.动态库
    • 1.1 分类
    • 1.2 生成动态库
    • 1.3 使用
    • 1.4 动态库配合环境变量的使用
  • 2. 静态库
    • 2.1 分类
    • 2.2 静态库的的生成
    • 2.3 使用
  • 3. 静态链接和动态链接
  • 4. 文件系统(针对磁盘而言)
    • 4.1 ext2文件系统:
    • 4.2 存储数据的逻辑
    • 4.3 获取文件的逻辑
  • 5.软硬链接
    • 5.1 软连接
    • 5.2 硬链接


1.动态库

1.1 分类

  • windows下:后缀为.dll的文件为动态库
    Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第1张图片
  • linux下:后缀为.so,前缀为lib的文件为动态库
    Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第2张图片

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()函数
Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第3张图片
然后test.c中实现print()函数
Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第4张图片
接着我们将这个test.c编译成一个动态库
在这里插入图片描述
接着我们将test.c移出当前文件夹,此时我们若想使用刚才写的print()函数就得依赖libmytest.so,若我们直接运行main.c会发现找不到‘print’
Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第5张图片
而此时我们就可以运行test_main
在这里插入图片描述

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

Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第6张图片
当我们将生成的动态库libmytest.so移出当前文件夹,我们会看到如下结果,test_main不能运行
Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第7张图片

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

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

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

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

Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第8张图片

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[静态库的名称]

Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第9张图片
注意:如果可执行程序依赖静态库进行编译成功的,会将静态库的内容直接打包到可执行程序当中

如下图所示使用ldd命令是看不到静态库的:
Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第10张图片

3. 静态链接和动态链接

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

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

4.1 ext2文件系统:

Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第11张图片
上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的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)展示给用户,文件的元信息以及文件内容
Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第12张图片
Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第13张图片

5.软硬链接

5.1 软连接

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

如何创建一个软连接

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

Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第14张图片

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

Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第15张图片

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

Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第16张图片

5.2 硬链接

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

如何创建一个硬链接文件

  • ln [源文件] [硬链接文件]
    Linux——基础IO(三):动态库&静态库,动态链接&静态链接,文件系统,软硬链接_第17张图片
  • 删除源文件对硬链接文件没有影响

你可能感兴趣的:(linux,linux,动态链接,静态链接,软硬连接,动态库静态库)