静态库动态库

我们使用ls-l的时候看到的除了看到文件名,还看到文件的元数据

拥有的权限
硬链接数
文件所有者

大小
文件最后修改时间
文件名

ls-l读取存储在磁盘上的文件信息,然后显示出来
其实这个信息除了通过这种方式来读取,还有一个sata命令能够看到更多的信息
这里写图片描述
上面的执行结果有几个信息需要解释一下
inode
为了能解释清楚inode我们先了解下文件系统
这里写图片描述
超级块:存放文件系统本身的结构信息。
i节点表:存放文件属性如文件大小,所有者,最近修改时间等
数据区:存放文件的内容

硬链接与软连接
硬链接
我们由上面知道,真正找到磁盘文件的并不是文件名,而是inode。其实在Linux宏可以让多个文件名对应于同一个inode。

touch abc
ln abc def
ls -li abc def
我们可以看到创建的这两个文件inode时一样的,他们的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数。而我们在删除文件时干了两件事,1,在目录中将对应的记录删除 2,将硬链接-1,如果为0,则将对应的磁盘释放

软连接
硬链接是通过inode引入另一个文件,软连接是通过他的名字引用另一个文件,在shell中的做法是

adc
abc.s->abc
def
这里写图片描述

动态库和静态库

静态库:程序在编译连接的时候把库的代码链接到可执行文件中。程序运行的时候不再需要静态库
动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用静态库的代码。
一个与动态库连接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程公用,节省了内存和磁盘空间。

测试程序

/////////////////add.h/////////////////

ifdef ADD_H

define ADD_H

int add(int a,int b);

endif//ADD_H

/////////////////add.c/////////////////

include”add.h”

int add(int a,int b)
{
return a+b;
}

/////////////////sub.h/////////////////

ifdef SUB_H

define SUB_H

int sub(int a,int b);
//////////////////sub.c////////////////

include “sub.h”

int sub(int a,int b)
{
return a-b;
}
/////////////////main.c///////////////
int main()
{
int a = 10;
int b = 20;
printf(“add(%d,%d) = %d\n”,a,b,add(a,b));
a = 100;
b = 20;
printf(“sub(%d,%d) = %d\n”,a,b,sub(a,b));
}
接下来我们就要生成静态库

在命令行输入:gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
//生成静态库
ar -rc libmymath.a add.o sub.o
//ar是gnu归档工具,rc表示(replace and creat)
接下来我们可以查看静态库中的目录列表

ar -tv libmymath.a
其中t:列出静态库中的文件
v:详细信息
//我们在编译的时候加上我们写的静态库
gcc main.c -L. -lmymath
其中 -L 指定库路径
-l 指定库名
测试目标文件生成后,将静态库删掉,程序照样可以运行
生成动态库

gcc -fPIC -c sub.c add.c//产生位置无关码
gcc -shared -o libmymath.so *.o//shared表示生成共享库格式
运行动态库

export LD_LIBRARY_PATH=.
gcc main.c -lmymath
./a.out

猜你喜欢

转载自blog.csdn.net/yummy_alice/article/details/79990698