文章目录:
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 [源文件] [硬链接文件]
- 删除源文件对硬链接文件没有影响