软硬连接及动静态库
目录
一、理解文件系统在磁盘中的存储
(1)inode是什么
(2)硬链接
(3)软链接
二、动静态库
(1)静态库
二、动态库
三、在链接动静态库的时候如何不用指定路径
一、理解文件系统在磁盘中的存储
(1)inode是什么
我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。
这些数据每行都有7列:
权限 硬链接数量 文件所有者 文件所属组 大小 最后修改时间 文件名
ls是从磁盘上读取存储在磁盘上的文件信息,然后显示出来
其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息
这里面有一些信息我们需要解释一下:
inode:为了能解释清楚inode我们先简单了解一下文件系统
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。
将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。
通过这段话我们可以理解:inode是用来存放文件的属性+文件内容数据块的编号,操作系统在查找一个文件的时候就是先得到他的inode编号,然后在磁盘中根据inode的编号找到该文件属于哪一个分区,再从该分区中找到自己是哪一个Block Group,然后在自己的Block Group找到inode table进而找到存放数据的数据块。
(2)硬链接
所以在磁盘中存放的并不是文件名,而是inode,而目录中存放的就是文件名和inode的映射关系。那么在Linux中我们可以在目录文件中让多个文件名映射同一个inode,即硬链接
硬链接就好像我们c++里面的&符号,表示前者是后者的别名
(3)软链接
软链接是通过一个新的inode映射一个文件,而该文件中存储的就是其他文件的路径!
二、动静态库
(1)静态库
(1)静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
(2)动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
(3)一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
(4)动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
其中ar是归档工具,选项rc表示replace and creat
我们已经成功创建了一个静态库了,下面我们用这个静态库来链接一下,让我们的源文件也能使用静态库中的函数
这里的-L选项是告诉编译器我们的静态库在哪个路径下面;而-l选项是告诉编译器要链接哪一个静态库。值得注意的是,这里的静态库需要掐头去尾只保留自己的名字。
二、动态库
到这里我们的动静态库都能够正常使用了
三、在链接动静态库的时候如何不用指定路径
(1)拷贝库文件到系统查询库的路径下,一般指/usr/lib(就是让编译器知道我们的库文件放在哪里)
(2)更改环境变量LD_LIBRARY_PATH
(3)修改配置文件(本质上也是该环境变量)
配置/etc/ld.so.conf.d/,ldconfig更新
(4)在系统查询库的路径下弄一个软硬链接出来,让这个软硬链接指向我们的库