【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

这篇具有很好参考价值的文章主要介绍了【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器
🍁你好,我是 RO-BERRY
📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器



1.理解软硬链接

软链接和硬链接是在Linux系统中常见的文件链接方式。

软链接(Symbolic Link): 软链接是一个指向目标文件或目录的特殊文件,类似于Windows系统中的快捷方式。软链接可以跨文件系统,可以链接到目录,也可以链接到文件。软链接的特点是:

  1. 软链接文件有自己的inode和文件名,但是数据块内容是指向目标文件的路径。
  2. 删除软链接不会影响目标文件。
  3. 软链接可以跨文件系统,即可以链接到不同的磁盘分区。

硬链接(Hard Link): 硬链接是指多个文件名指向同一个inode,它们共享同一份数据块内容。硬链接的特点是:

  1. 硬链接文件和目标文件具有相同的inode和数据块内容。
  2. 删除任意一个硬链接文件不会影响其他硬链接文件和目标文件。
  3. 硬链接只能链接到文件,不能链接到目录。
  4. 硬链接不能跨文件系统,即只能在同一个磁盘分区内创建。

1.1 操作观察现象


指令ln -s

ln -s是Linux系统中的一个命令,用于创建软链接(symbolic link)。软链接是一种特殊的文件,它指向另一个文件或目录。通过软链接,可以在不改变原始文件或目录位置的情况下,创建一个指向它的链接。

使用ln -s命令创建软链接的语法如下:

ln -s <原始文件或目录路径> <链接文件路径>

  • 其中,<原始文件或目录路径>是要创建链接的文件或目录的路径,<链接文件路径>是要创建的软链接的路径。
    例如,假设当前目录下有一个文件file.txt,我们可以使用以下命令创建一个指向它的软链接:
    ln -s file.txt link.txt
    这样就创建了一个名为link.txt的软链接,它指向file.txt文件。

需要注意的是,软链接是一个指向原始文件或目录的引用,而不是实际的文件或目录本身。删除软链接不会影响原始文件或目录,但删除原始文件或目录可能会导致软链接失效。


指令ll -li

ll -li是一个Linux命令,用于显示文件或目录的详细信息,并以inode号进行排序。下面是该命令的一些说明:

  • ll是 “ls -l” 的简写,用于显示文件和目录的详细信息。
  • -li是两个选项的组合,其中 -l表示以长格式显示文件信息,包括文件权限、所有者、大小、修改日期等;而 -i表示显示文件的inode号。

通过执行 ll -li 命令,您将看到当前目录下所有文件和目录的详细信息,并按照inode号进行排序。


软链接

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器结论:软链接本质上就是一个文件,有独立的inode


指令ln

在Linux系统中创建文件硬链接,可以通过ln命令来创建硬链接。ln命令的语法如下:

ln [选项] <源文件或目录> <目标文件或目录>

其中,源文件或目录是要创建链接的文件或目录的路径,目标文件或目录是要创建的链接的路径。

创建硬链接的命令格式为:

ln <源文件> <目标文件>

例如,要在当前目录下创建一个名为linkfile的硬链接,指向源文件sourcefile,可以使用以下命令:
ln sourcefile linkfile

注意,硬链接只能链接到同一个文件系统中的文件,且不能链接到目录。


硬链接

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

我们创建了硬链接之后可以发现。前面的文件信息发生了一个微小的变化,也就是文件权限后面的数字由1变成了2,而硬链接新出现的文件其初始数字就是2,这个数字从来没有讲述过

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

我们查看一下inode也可以发现,新出现的文件与旧文件inode竟然是一样的!

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器
结论:硬链接本质不是一个独立的文件,因为它的inode编号和目标文件相同


1.2 软硬链接的原理

测试硬链接

  • 我们将硬链接的目标文件写入点数据
    【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

可以看到我们修改目标文件的同时,硬链接生成的文件也会发生变化,其大小与目标文件同样是12,且修改时间相同,inode也没有改变

  • 我们删除目标文件
    【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

可以看到,我们的硬链接产生的文件并没有什么变化,我们查看其文件数据可以清楚的看到,这个数据就是我们当初输入到目标文件的数据,这是什么情况?

其实也可以理解,其inode和目标文件是一摸一样的,也就是说他们对应的都是同一个文件,我们硬链接的工作特别像给目标文件进行一个重命名,并且源文件不改变。

硬链接的本质:一定没有新建文件,因为没有新的inode,只是新建了一个文件名,与目标文件inode相同的映射关系。


这个时候我们再看当初的这个2
【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

其实这就是一个硬链接数,表明有多少个硬链接,表明了有多少个文件名与这一块数据有相同的映射关系,同时也叫引用计数

同时可以看到,硬链接就是建立了一个映射关系同时对引用计数++即可。

我们删掉文件后可以看到,引用计数从2变成了1
【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器


测试软链接

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器
软链接创建的文件有独立的inode,有独立的inode那么就有独立的属性以及独立的数据内容。

软链接本质就是一个独立文件,软链接内容里面放的目标文件的路径!

软链接就相当于我们Windows里面的快捷方式,其存储的就是其可执行程序的路径

1.3 软硬链接的应用场景

1.3.1软链接

  • 我们创建一系列文件并输入内容给test.c

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

#include<stdio.h>
int main()
{
  printf("hello world\n");
  return 0;
}
  • 将文件编译,并把可执行文件移动到bin目录下

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

  • 我们想访问这个可执行文件就只能访问绝对路径访问

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

  • 我们还可以采用软链接的方式访问到这个可执行文件

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器
我们就可以使用软链接的方式,在当前目录创建一个软链接的文件,这样就可以直接访问到深路径的文件,我们使用起来就更加方便


我们也可以采用硬链接的方式来达到访问深路径的文件
【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

软链接使用起来还是更加方便一些,一般推荐软链接


系统有很多的软链接

ls -l /lib64/

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器


1.3.2 硬链接

  • 我们创建一个普通文件以及一个目录
    【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

可以发现普通文件的硬链接数是1,而目录一创建出来硬链接数就是2。

  • 我们进入empty目录下

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

我们可以看到empty目录下有隐藏的点文件,我们之前讲过,这个就是指的当前目录,它的inode与empty目录的inode是一模一样的,而它就是除了empty外另一个硬链接。

  • 我们进入empty目录下再创建一个a目录

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

这里可以看到我们的empty目录的硬链接数变成了3,这就是因为我们empty目录里的a目录里有一个自带的点点文件,这代表的是上级目录,它就是第三个empty目录的硬链接

由此得知:一个目录下有多少个子目录:硬链接数-2即可计算得到

注意:Linux中不允许给目录建立硬链接,但是可以建立软链接


2.动静态库

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码

  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)

  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。


我们是很经常使用库的,我们创建一个普通C文件,并编写简单代码

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

这里就是利用了C语言的库的,之前进行简单的讲解过,这是C语言的动态库

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器


关于库我们有过一定的使用经验
库分为静态库以及动态库-----大部分的系统默认安装的是动态库,云服务器是静态库–(C标准库)默认是没有安装的
默认编译程序,用的是动态链接的,如果要静态要加-static

库的真实名字:lib. XXXX -a/so 去掉前缀以及后缀

2.1 动静态库的制作和使用

一般我们的程序执行会经历几个阶段

  1. a.h + a.c ---> a.o
  2. b.h + b.c ---> b.o
  3. c.h + c.c ---> c.o
  4. d.h + d.c ---> d.o
  5. 再结合libc.so/libc.a
  6. 最后main.c ------>main.o

库则是不提供.c文件

  1. a.h + a.o
  2. b.h + b.o
  3. c.h + c.o
  4. d.h + d.o

你只需要将main.c ------>main.o
注:这里的a、b、c、d只是概念文件

所谓的库就是将所有的.o文件用特定的方式,进行打包,形成一个文件

库的存在的意义:

  1. 提高开发效率
  2. 隐藏源代码

准备工作

在了解库的使用原理后我们来模拟实现一个

  1. 创建五个文件
    【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器
  2. 编写文件

add.c

#include "add.h"
int add(int a, int b)
{
  return a + b;
}

add.h

#ifndef __ADD_H__
#define __ADD_H__ 
int add(int a, int b); 
#endif // __ADD_H__

sub.h

#ifndef __SUB_H__
#define __SUB_H__ 
int sub(int a, int b); 
#endif // __SUB_H

sub.c

#include "add.h"
int sub(int a, int b)
{
  return a - b;
}

main.c

#include <stdio.h>
#include "add.h"
#include "sub.h"
 
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));
}

生成.o文件
【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

生成静态库

指令ar -rc

ar -rc是一个用于创建或更新静态库的命令。它是GNU工具链中的一个工具,用于将一组目标文件打包成一个静态库文件。下面是ar -rc命令的一些常见用法:

  • 创建静态库:可以使用ar -rc命令将多个目标文件打包成一个静态库文件。例如,要将文件1.o、文件2.o和文件3.o打包成一个名为libexample.a的静态库,可以执行以下命令:

ar -rc libexample.a 1.o 2.o 3.o

  • 更新静态库:如果已经存在一个静态库文件,可以使用ar -rc命令向其中添加新的目标文件或替换已有的目标文件。例如,要向名为libexample.a的静态库中添加一个新的目标文件file.o,可以执行以下命令:

ar -rc libexample.a file.o

  • 替换静态库中的目标文件:如果要替换静态库中已有的目标文件,可以使用ar -rc命令指定相同的目标文件名。例如,要替换名为libexample.a的静态库中的目标文件file.o,可以执行以下命令:

ar -rc libexample.a file.o

  • 查看静态库内容:可以使用ar -t命令来查看静态库中包含的目标文件列表。例如,要查看名为libexample.a的静态库中包含的目标文件列表,可以执行以下命令:

ar -t libexample.a


输入指令ar -rc libmymath.a add.o sub.o生成静态库
查看静态库中的目录列表 ar -tv libmymath.a
t:列出静态库中的文件
v:verbose 详细信息

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器
所以库的本质就是把一堆.o打包形成一个文件,然后通过头文件来调用库。注意,库中不能包含main函数。

编译一下,即可运行

gcc (要形成的可执行文件名) main.c(所依赖的文件) -L .(-L + 路径表示myc这个库在哪个路径下)-lmymath(指明要链接mymath这个静态库)

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器


生成动态库

fPIC:产生位置无关码,在将.c或者.cpp形成.o文件时,需要加上-fPIC。要形成动态库必须加上-fPIC。
【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

形成动态库不需要用到其它指令,gcc编译器就可以形成动态库,只不过要加上-shared命令。

gcc -shared -o libmymath.so(名字,真正的库名要去掉lib和.so)sub.o add.o (所依赖的.o文件)

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器
直接使用我们的这个动态库,那么就同样要告诉编译器我们库的名字和所在的路径(参考上面静态库路径的写法)。

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

2.2 将自己的库打包给别人

假设在我当前目录下有libmymath.so动态库,add.h,sub.h两个头文件,如果我想将这三个文件一起交给别人,就可以把它们打包一起放在一个目录下,一起压缩完再交给别人。
【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

Makefile

 1 libmymath.so:add.o sub.o
  2     gcc -shared -o $@ $^
  3 .o:.c
  4     gcc -shared -c $<
  5 #add.o:add.c
  6 #   gcc -c -fPIC $< -o $@
  7 #sub.o:sub.c
  8 #   gcc -c -fPIC $< -o $@
  9 .PHONY:clean
 10 clean:
 11   rm -f *.o libmymath.so
 12 
 13 .PHONY:output                                                                                                                                                                           
 14 output:
 15         mkdir -p ./user/mylib/
 16         mkdir -p ./user/Headfile/
 17         cp -rf libmymath.so ./user/mylib/
 18         cp -rf add.h sub.h ./user/Headfile/
 19         tar -czf user.tgz user

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

user目录是通过user.tgz解压得到的,下面是user目录下的文件:

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器

将两个头文件拷贝到usr/include目录下(编译器默认会到include目录下去寻找头文件),将库文件拷贝到usr/lib目录下,编译时指定库链接,就能够运行了。
【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用,linux学习,linux,运维,服务器
文章来源地址https://www.toymoban.com/news/detail-850082.html

到了这里,关于【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【看表情包学Linux】软硬链接 | 软连接数 | 创建软硬链接 | 动静态库 | 生成静态库 | 生成动态库

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 上一章我们讲解了 inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困

    2024年02月14日
    浏览(42)
  • 【Linux】软硬链接和动静态库

    **软链接:**是一个独立文件,有自己独立的 inode 和 inode 编号。 **硬链接:**不是一个独立的文件,它和目标文件使用的是同一个 inode。硬链接就是单纯的在 Linux 指定的目录下,给指定的文件新增 文件名 和 inode 编号的映射关系! 我们可以通过如下命令,创建一个文件的软硬

    2024年02月05日
    浏览(34)
  • 【Linux】软硬链接与动静态库

    相关文章: 【Linux】动静态库以及动静态链接 【Linux】基础IO_文件系统 我们知道,每一个文件都会有自己的inode编号,我们可以通过如下指令来查看:  我们发现, 每一个不同文件的inode编号都不相同,所以inode可以说是用来标识文件的标识符 。接下来,我们通过下面指令来

    2024年02月10日
    浏览(45)
  • Linux软硬链接和动静态库

    本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 当我们安装一款软件成功后,桌面会多一个图标,如果我们点击图标就能启动软件,但那个图标就是软件本身吗?显然不是!图标只是软件启动程序的一个快捷方式,在Linux中可以通过软硬链接来创建类

    2024年02月08日
    浏览(36)
  • 【看表情包学Linux】软硬链接 | 动静态库

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 上一章我们讲解了 inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困

    2024年02月16日
    浏览(38)
  • Linux基础IO【软硬链接与动静态库】

    ✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 假设你下载了一款游戏,你是否会跑到游戏所在目录中双击 .exe 打开游戏?答案是不会,大多数人都会通过桌面的快捷方式直接打开文件,而这个快捷方式实际就是对 .exe 的 软链接 文

    2024年02月02日
    浏览(37)
  • 【Linux】基础IO——文件系统|软硬链接|动静态库

    基于上篇博客所写到的文件各种操作都是基于被打开文件所进行操作的,那么如果一个文件没有被打开它存在哪里呢?这个答案毫无疑问肯定是存在于磁盘上的。那么,对于一个没有打开的文件(也就是磁盘文件)我们应该如何理解呢? 这里我们所要讲的磁盘是机械硬盘、即

    2024年02月04日
    浏览(45)
  • 动静态库的理解、制作、使用。

    1.什么是库? 代码是无穷无尽的,当程序猿在写一些项目时,未必所有代码亲历亲为,他们可以在网上寻找大佬写过的一些有关需求的代码,这些代码可以让他们拿过来直接使用,而省去了许多精力。 把一些 代码进行打包 ,形成的便是库了。   上面所说,库就是将代码进行

    2024年01月24日
    浏览(45)
  • 【linux】:老师问什么是爱情,我说了句:软硬链接和动静态库

        文章目录 前言 一、软硬链接 二、动态库和静态库 总结   上一篇文章的最后我们讲解了文件的inode,那么文件名和inode有什么区别呢?区别就在于linux系统只认inode号,文件的inode属性中,并不存在文件名,而文件名其实是给用户用的。我们以前讲过linux文件目录,那么目

    2023年04月19日
    浏览(126)
  • 【探索Linux】—— 强大的命令行工具 P.13(文件系统 | 软硬链接 | 动态库和静态库)

    在计算机科学领域中,Linux 系统一直以来都是备受推崇的操作系统之一。其中,文件系统、软硬链接、动态库和静态库是 Linux 系统中非常重要的概念,在实际应用中扮演着不可或缺的角色。 在上一篇文章中,我们了解了 Linux 系统中文件描述符、重定向以及基础 IO 操作的相关

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包