欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > Linux——软硬链接

Linux——软硬链接

2024/12/22 18:45:46 来源:https://blog.csdn.net/m0_75262940/article/details/142763045  浏览:    关键词:Linux——软硬链接

一、创建软硬链接文件

        对文件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:后面跟的是路径,表示库所在的位置

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com