一、创建软硬链接文件
对文件test.c创建软链接,发现软链接文件的inode编号和原来文件不一致,说明创建的软链接文件是一个独立的文件。而创建硬链接的时候,硬链接文件的inode编号和原来的文件一致,说明创建的硬链接文件和原来的文件是同一个文件,而不是独立的文件。从文件的属性当中可以看出,link.hard、test.c都有两个硬链接关系。
二、软硬链接的原理及应用
1)硬链接的本质:
没有创建新文件,而是创建了一条文件名和inode的映射关系,并且将映射关系是写入到目录的数据区当中。在inode里面,存在一个引用计数器,即当被硬链接一次,其计数器就加一,目录就可以获取到文件的硬链接次数。所以其本质就是在目录文件当中增加一组映射关系,而删除链接的本质其实就是删除该映射关系,删除文件的本质就是删除该文件的最后一层映射关系。
在创建一个空文件夹的时候,硬连接数默认是2,因为父文件夹下面有一映射关系,自己文件夹内部也有一映射关系。
每当在该文件夹下面创建一个新文件夹,硬链接数就会增加1,因为每一个子文件夹里面存在上级目录的映射关系,这样才能够返回到上级目录,所以一个文件夹里面子文件夹的数量=该硬链接数-2。硬链接的作用就是返回上一级文件夹。
注意:只有系统可以对文件夹创建硬链接,用户不能对文件夹创建硬链接。因为在对文件夹创建硬链接时,一定会出现环路问题,
2)软链接的原理:
软链接的时候会创建新文件,新文件里面会存储原文件的文件路径。
作用是可以创建快捷方式,方便操作。
三、动态库和静态库问题
1)库的作用
提供一些现成的基本函数方法,提高开发效率,隐藏源文件,对一些系统调用做封装,保证其跨平台性。在云服务器中,一般只安装C/C++动态库,静态库默认是不安装的,编译时默认也是用的动态链接,如果需要静态链接,需要加上-static。动态库的命名一般为libxxx.so,静态库的命名一般为libxxx.a。xxx才是库的名字。
2)封装并使用第三方动静态库
1.C程序的编译过程
预处理(将所有源文件中的注释全部去掉,将头文件中的内容拷贝到源文件中)---》汇编(将一个个预处理后的源文件翻译成汇编代码)---》编译(将所有源文件编译为一个个的二进制文件)---》链接(将所有二进制文件链接为一个可执行程序)。
举例
在当前工程中,存在mymath.c,mymath.h,mystdio.c,mystdio.h这四个文件,
将.c文件全部编译为.o文件,再通过gcc将.o文件编译为可执行程序。
2.封装自定义静态库
封装库的实质其实是在上面的基础上,将源文件编译为.o文件后,再将头文件和.o文件封装为库。
# 使用方法
ar -rc libmyc.a mymath.o mystdio.o
-r:表示如果该库存在,就将其替换
-c:表示如果该库不存在,则创建该库
使用以上命令,将.o文件封装为静态库,注意,因为main函数是程序的入口,所以在制作库的时候,一定不能将带有main函数的.o文件封装进去。
3.封装自定义动态库
与制作静态库相同,第一步将源文件编译为.o二进制文件,但在编译时,需带上-fPIC,以创建.o文件,其中-fPIC的作用为编译为位置无关码。完成源文件的编译后,再使用gcc -o shared将编译后的.o文件生成动态库。
# 将mymath.c和mystdio.c制作为libmyc.so动态库方法
gcc -c -fPIC mymath.c mystdio.c
gcc -shared -o libmyc.so mymath.o mystdio.o
以上步骤亦可通过make和makefile一步完成
# makefile
libmyc.so:mymath.o mystdio.ogcc -shared -o $@ $^
%.o:%.cgcc -c -fPIC $^
.PHONY:clean
clean:rm -rf mymath.o mystdio.o libmyc.so
4.使用自定义第三方库进行编译
gcc编译时,默认在系统目录下寻找所需库,但是利用自定义库编译时,由于不知需要依赖库的库名,同时不知道自定义依赖库位置,所以需要指定库名和库的位置。所以使用自定义库编译的命令为:
# 使用方法
gcc main.o -lmyc -L .
-l:后面跟的是库名,表示需要使用的库
-L:后面跟的是路径,表示库所在的位置