Linux相关概念和易错知识点(21)(软硬链接、动静态库)

【Linux】软硬链接 && 动静态库(很详细) 世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!提示:以下是本篇文章正文内容,下面案例可供参考Linux系统里路径具有唯一性;(软链接的内容:目标文件所对应的路径字符串。系统对路径进行路径解析,进而找到目标文件。(多了一个找到目标文件的方式)好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。 阅读详情

目录

1.软硬链接

(1)软链接

(2)硬链接

①实现方式及其功能

②硬链接在目录中的运用

③计算子目录数量

2.动静态库

(1)动态库

①动态链接和静态链接

②动态库的实现

③系统查找动态库问题

④解决系统查找动态库问题

a.拷贝动态库到系统默认路径下

b.在系统层面进行软链接

c.修改环境变量

d.全局配置路径

⑤动态库和头文件存放位置对编译过程的影响

a.动态库

b.头文件

(2)静态库

①和动态库的区别

②静态库打包

③静态编译


1.软硬链接

简单地说,对一个文件进行链接就是针对该文件创建快捷方式。不过软硬链接有所区别。

(1)软链接

使用ln -s (源文件) (快捷方式)可以创建一个软链接。

软链接文件有独特的标识,最前面的标识符不是目录的d,也不是普通类型文件的-,而是l

针对软链接文件,对它进行访问操作,会自动根据软链接文件里面保存的路径直接访问目标文件。我们所有访问这个软链接文件的操作都会转为访问目标文件(vim、cat等),这是文件类型的特性。除此之外,软链接文件具有文件的一切属性(inode、权限、修改时间等),它是一个完整的、独立的文件,只不过具有快捷方式的功能,可以帮我们在其它地方快速访问文件。

软链接的内容是目标文件的路径,这就意味着如果目标文件的路径修改,这个软链接文件的内容无法指向指定文件,就会失效。

要特别注意软链接是通过路径来定位目标文件的,需要保证文件名、路径所途径的目录相同才能定位,而不是通过inode进行定位的。

我们把文件还原回来,软链接文件的内容又能链接上了,因此还能恢复软链接功能,而不是那种一旦失效就永久失效的文件。

(2)硬链接

软链接本质上就是通过文件和文件的映射来实现创建快捷方式的操作的。硬链接直接从inode入手。

①实现方式及其功能

使用ln (源文件) (快捷方式)可以创建一个硬链接。

我们已经知道目录文件的内容就是文件名和inode的映射表。一个文件名对应一个inode,这个inode一般情况下只会在系统中出现一次,引用计数就是1。但硬链接本质就是在当前目录中新增一组新的文件名和inode的映射关系。相当于一个文件有了两个文件名。重命名过程就是依赖硬链接完成的。

硬链接是采用inode定位目标文件的,因此无论目标文件跑到哪,硬链接都能定位上。

硬链接通过inode引用计数的方式创建快捷方式,除了inode精准定位以外,还带来了一个很厉害的功能,就是无消耗备份。

文件的inode属性在底层是保存在硬盘中的,当打开文件后读取inode,并会将新的inode属性写回去。其中inode属性就包含自己的引用计数。如果引用计数为0,就说明没有文件名指向inode,也就是说此时文件已经失效了,系统这时候就会删除文件。如果一个文件引用计数为2,那么当我们对文件进行删除时,系统不会删除文件,而是只会对文件inode的引用计数减1。这就意味着,当我们创建了一个硬链接时,可以认为对文件创建了一层备份,当误删文件时,由于引用计数的特性,文件会被保存下来。

②硬链接在目录中的运用

硬链接我们可以说是天天见。

这下我们能够进一步理解.和..的原理了。当我们创建目录时,这个目录里面就自动创建了两个硬链接,一个是指向本级目录,一个是指向上级目录。

我们还能由此解释,为什么创建目录时引用计数一来就是2

我们也能解释根目录是如何特殊处理cd ..命令的了,它只需要将根目录的上级目录硬链接自己就行了。所以我们在根目录cd上级目录还是根目录。但是有个细节需要注意,根目录的..会特殊处理,不会增加inode的引用计数,我们了解即可。

由于Linux存储结构是树形的,而目录的硬链接恰好会破坏树状结构。

其实我们想想,目录和.本质上已经构成了环状结构,只不过紧挨着两级的环状结构退化成了线性结构。Linux为防止我们造出环状路径,让树状结构更混乱,因此Linux不允许我们针对目录文件进行硬链接,有且仅有.和..是硬链接。因此要对目录创建快捷方式,我们只能用软链接,软链接本质上只是个带路径并特殊处理的文件,所以软链接针对目录文件没有任何问题。

③计算子目录数量

我们借助.和..自动创建的特性,可以通过引用计数推断子目录的数量,毕竟每创建一个子目录,其父目录就会多一个硬链接..。

只要子目录下的..目录指向自己,都要加引用计数。软链接对应目录的上级目录一般不增加引用计数。

注意根目录也遵循这条规则,但根目录的..目录也指向自己,如果增加引用计数,那就不符合规则了,所以系统会特殊处理,其..不会增加引用计数。

2.动静态库

(1)动态库

①动态链接和静态链接

之前我介绍过动静态链接的区别,读者可自行查看。

简单来说,动态库就是.so文件,如果可执行程序采用动态链接,可执行程序必须要和.so联合才能正常执行(头文件不需要,预处理时就已经展开)。

静态库就是.a文件,如果可执行程序采用静态链接,只需要可执行程序就能正常执行(所有库方法都存入可执行程序里了)。

这次我将侧重于动静态库的模拟实现,进一步加深我们对动静态库的理解。

②动态库的实现

第一步,就是先将库的源文件变成.o文件,gcc -fPIC。这样生成的.o才能用于.so的生成

第二步,将所有的相关的.o文件都打包成.so文件。这些.o文件里面对应的就是函数具体实现,-shared选项告诉编译器不要形成可执行程序。

注意生成动态库的名字必须满足前缀lib,后缀.so,这会影响后续的识别

第三步,生成可执行程序,注意-I(大写的i),-L和-l(小写的L)三个选项的含义,定位到具体的头文件目录才能进一步查找(预处理)。定位到具体的目录和.so文件才知道调用的动态库(编译、链接)。

③系统查找动态库问题

按照上述步骤,我们本应能正常执行可执行程序了,但事实上还不行,因为ldd test看出我们的动态库并没有地址指向,这也就意味着当执行时系统不知道到哪里去找动态库的实现。

可是我们不是已经-L和-l定位了文件吗?

这是因为-L和-l是在gcc编译和链接时使用的,而我们是想让这个可执行程序变成一个进程,执行它时,系统找的时候会按照自己的默认路径去找,这和我们在gcc使用的-L和-l没有任何关系,所以是找不到我们的可执行程序的。从另一个角度上讲,动态库的存在就是为了脱离可执行程序,交由系统管理和调用,因此动态库的地址是不能存到在可执行程序里面的,这会增强耦合度。是系统在执行我们的程序时,按照默认的路径去找要调用的动态库,再正常执行。

因此,我们要解决的就是动态库的配置问题了,要让系统能够找到动态库。

④解决系统查找动态库问题

既然知道可执行程序和动态库解耦合,动态库全权交由系统管理和调用,因此唯一解决系统查找动态库的问题的方法就是让系统默认查找路径能够找到动态库。以下方法均遵循这个思路。

a.拷贝动态库到系统默认路径下

将.so文件放在系统/lib64或者/lib(根据系统决定,可自行尝试),这样系统就能查找到动态库,正确的加载动态库并执行。

b.在系统层面进行软链接

利用ln -s 在/lib64或/lib里面创建软链接,本质原理还是让动态库保存在系统查找的必经之路上。

unlink (完成文件名)可以删掉软链接

c.修改环境变量

Linux系统中,OS查找动态库依赖环境变量提供的路径,OS按理来说是根据LD_LIBARY_PATH环境变量中查找,我们可以配置环境变量用于修改系统查找.so的默认路径。

但在Ubuntu下面,大多数人遇到的是这种情况。

​​​​​​​

这需要我们先进行一些设置操作,在~/.bashrc最底行添加下面的语句,保证该环境变量能被使用。​​​​​​​​​​​​​​

export 
LD\_LIBRARY\_PATH=$LD\_LIBRARY\_PATH:./lib:/lib:/lib64:/usr/lib:/usr/lib64:/usr/local/lib

在这之后,我们每次登录就都能看到LD_LIBARY_PATH的值,当然我们也可以对它进行修改以满足我们寻找动态库的需求。注意LD_LIBARY_PATH里面的值是系统会默认查找的路径,但不是意味着只会到LD_LIBARY_PATH指定的路径查找,这只是我们添加系统默认查找路径的方法之一。我们可以通过修改.bashrc里面的路径,来保障系统会默认来指定的位置查找动态库。这就意味着我们不需要将这个动态库安装到/lib或者/lib64里面,相对而言比较灵活。

d.全局配置路径

系统默认的查找路径还会从/etc/ld.so.conf.d目录读取,我们可以使用root身份,新建.conf文件,名字随便取保证后缀即可。使用echo强制在里面写读取路径(路径指向.so对应目录即可)。ldconfig更新配置文件​​​​​​​使其生效,之后我们就可以正常执行文件而不需要将动态库安装到/lib或者/lib64目录下了。

​​​​​​​

以上4种方式提供了动态库的查找问题,前两种的核心思想是想办法安装在系统中,后两种则是侧重于修改查找路径使得系统能够找到它。

⑤动态库和头文件存放位置对编译过程的影响

a.动态库

上面就解决可执行程序的执行已经讲解了存放动态库到系统目录/lib或者/lib64的重要性。将动态库安装在系统中,除了系统能够找到动态库,正常执行可执行程序之外,我们的编译过程gcc可以省去-L这个选项,可以不再指定目录进行编译链接。

但特别注意,-l(小写L)这个选项不能省去(就算一个目录里就只有一个动态库,这是统一规定),因为编译过程要面对的动态库很多,编译器在编译时只知道声明而不知道定义在哪,找不到我们的动态库,所以只有显式指定。执行可执行程序时不需要指定动态库名字、只需要路径的原因是可执行程序已经有了动态库的名字了,只需要路径就能找到。理解两者的差异,搞清楚为什么要这么做很重要。

b.头文件

/usr/include/是系统的头文件目录,如果我们将头文件放到该目录下,预处理时,使用<xxx.h>就能够找到,如果放在源文件目录下,需要用"xxx.h","xxx.h"会先在当级目录查找,再到系统查找,而<xxx.h>只会在系统中查找。除此之外,"xxx.h"在查完系统目录后还能在制定目录下查找,就是-I(大写的i)对应目录。

注意,头文件的展开是预处理干的事,预处理之后头文件就没意义了,所以上述注意事项是在gcc/g++编译时需要注意的。当生成可执行程序之后,头文件在不在、在哪都不会影响可执行程序的执行。

(2)静态库

①和动态库的区别

理解了动态库,静态库相对而言就比较简单了,大部分过程都是相似的。动态库是将.so安装在系统目录中或者让系统能够找到它,在执行程序时调用它,动态库不存放在可执行程序中,因此可执行程序相对较小。

而静态库文件是.a文件,其命名规则是前缀lib,后缀.a,在编译后会将整个静态库文件的内容拷贝到可执行程序中。因此,gcc编译后的.a和头文件存不存在、在哪都不会影响程序的执行,一个可执行程序可以独立运行,但代价是可执行程序相对较大,很多函数的实现都放在里面。

在gcc编译过程中,同样需要面临静态库文件的定位问题,这和动态库的gcc定位问题解决方法一致,都是使用-I(大写i)、-L、-l(小写L)辅助定位头文件和静态库。

②静态库打包

我们将所有的库.c编译成.o,这样我们拿着所有的.o打包成一个静态库,和动态库思路一致。

静态库打包使用指令ar -rc(存在就replace,不存在就create)lib.a (前缀必须是lib,后缀必须是.a) 1.o 2.o 3.o,之后我们将库文件和对应头文件交给别人,他们就能正常使用我们的库了,而不会知道源文件是什么样子。

注意事项和动态库的差不多,相对而言静态库在操作上还要简单一些。

③静态编译

在编译代码时,若我们同时提供动静态库,gcc/g++默认使用动态库。我们只有提供选项-static强制静态链接,同时必须提供静态库,不然会报错。但如果我们只提供静态库,但链接方式是动态链接(只要没有指定静态链接,都默认动态链接)的话,gcc和g++没得选,会针对.a采用局部性静态链接。
​​​​​​​

【FPGA教程案例49】控制案例1——基于FPGA的PID控制器verilog实现 PID控制器产生于1915年,PID控制律的概念最早是由LYAPIMOV提出的,到目前为止,PID控制器以及改进的PID控制器在工业控制领域里最为常见。PID控制器(比例-积分-微分控制器),由比例单元 P、积分单元 I 和微分单元 D 组成。通过Kp,Ki和Kd三个参数的设定。PID控制器主要适用于基本线性和动态特性不随时间变化的系统。图1为PID控制器的基本结构框图。PID控制器以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。... 阅读详情

相关推荐

solidworks实体显示线框

solidworks实体莫名其妙显示为有点虚的线框

qq_35858902的博客 1万+

Linux:软硬链接及动静态库

详细介绍了软硬链接的概念和使用场景,以及动静态库的制作使用、生成及使用场景。

2201_75880188的博客 1426

MPU6050芯片 寄存器详解与配置指南(详解)

分频值越小,数据刷新越快(如分频值 = 0 时,刷新率 = 8kHz/1=8kHz)。功能:配置采样频率分频系数,控制 ADC 转换速度和数据刷新率。数据刷新率 = 陀螺仪输出时钟频率 /(1 + 分频值)

m0_74696257的博客 1420

Linux---软硬链接,动静态库

Linux---动静态链接介绍,动静态库介绍及制作

blue_jun_的博客 1824

ArcGIS-裁剪遥感影像及dem图像

6、选择【工具箱】-【数据管理工具】-【栅格】-【裁剪】。在【输入栅格】里选择要裁剪的dem,在【输出范围】里选择刚创建的裁剪范围。选择一个输出路径,其他参数保存默认。2、起一个名称,要素类型选择【面】。点击【编辑】选择与要裁剪的dem一致的地理坐标系。1、创建需要裁剪区域的面层shp,右击选择【新建】-【shapefile】3、点击编辑器,选择开始编辑。4、选择【裁剪范围】,点击确定。5、画出想要裁剪的范围并保存。

siwenaiyou的博客 1万+

阿里云大模型ACP认证模拟考试(二)

摘要:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 2074

Linux 软连接和硬链接

硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。 软链接: 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式 2.软链接可以 跨文件系统 ,硬链接不可以 3.软链接可以对一个不存......

MyySophia的博客 6669

CTF-Web学习笔记:服务端请求伪造(SSRF)篇

本文系统介绍了CTF比赛中SSRF漏洞的攻防技术。首先解析了SSRF的核心原理,即利用服务器对用户输入URL的未校验缺陷,诱导其访问内网资源。然后详细分析了5类常见CTF题型:文件读取、内网探测、云服务元数据窃取、协议绕过及组合漏洞利用。重点讲解了绕过URL过滤、利用特殊协议(如dict://、gopher://)等实战技巧,并通过一道SSRF+Redis的高阶题目演示完整攻击链。最后给出防御建议:严格校验输入URL、禁用危险协议、实施内网隔离等。

Deng7326的博客 1704

linux静态库,动态库和硬链接,软连接

linux静态库,动态库和硬链接,软连接 标签:  杂谈 分类: linux/unix 静态库 1、命令gcc -c a.c b.c生成a.o和b.o; 2、命令ar -r libname.a a.o b.o生成包含名为libname.a的静态库; 3、命令gcc main.c libname.a可以在main中链接静态库libname.a。 动态库(共享库) ...

雪的季节 2607

ISO2626 --- Item Definition相关项定义

本文并不是针对ISO26262的一个项目,而是针对ISO26262的规范,我们在相关项定义阶段,我们需要做什么,我们的文档需要包含哪些内容的一个描述。

wj博客 909

Lammps模拟剪切作用下的位错滑移

Lammps模拟位错与障碍物作用。在lammps中实现周期性位错阵列模型模拟剪切作用下1/2刃位错与障碍物的交互作用

Rockyoung 3459

Linux软硬链接和动静态库

当我们安装一款软件成功后,桌面会多一个图标,如果我们点击图标就能启动软件,但那个图标就是软件本身吗?显然不是!图标只是软件启动程序的一个快捷方式,在Linux中可以通过软硬链接来创建类似于Windows下的软件快捷方式,Windows下创建快捷方式一般相当于Linux中的软连接;当Windows中的一个软件启动之后会加载各种文件,一般我们看到的软件启动程序都很小,但是软件安装包却很大,例如游戏,其实软件中大部分都是库文件,关于Linux下的库,本节将会详细为您介绍!

ARMCSKGT的博客 5273

华为OD机试2025C卷 - CPU调度策略 (C++ & Python & JAVA & JS & GO)

华为OD机试 2025C卷 CPU调度策略,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 1296

[Linux] linux 软硬链接与动静态库

[Linux] linux 软硬链接 与 动静态库

石墨博客 1640

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Linux】软硬链接,动静态库

本文摘要: 文章系统介绍了Linux系统中的软硬链接和动静态库相关知识。第一部分讲解了软硬链接的概念、创建指令及原理,包括软链接保存文件路径、硬链接作为引用计数等特性。第二部分详细阐述了动态库(.so)和静态库(.a)的区别:静态库编译时整合到程序,动态库运行时共享加载;介绍了库的制作使用方法和注意事项,如环境变量LD_LIBRARY_PATH的设置、gcc默认使用动态库等。最后简要提及动态库加载到进程地址空间的过程。全文通过命令示例和原理分析,帮助读者深入理解Linux文件链接机制和库文件的使用规范。

hffh123的博客 1819

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux基础IO--软硬链接与动静态库

其中的。

2401_83603768的博客 1207

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Linux:软硬链接和动静态库

!

2301_80153885的博客 1066

【Linux】软硬链接和动静态库

软硬链接的使用和动静态库的生成和使用

s_little_monster的博客 1万+

穿越文件之海:Linux链接与库的奇幻旅程,软硬连接与动静态库

在计算机的无形世界中,数据如河流般流淌,而文件系统则是河道的设计者。Linux,这位古老而睿智的守护者,为我们铺设了一条通往数字王国深处的道路。 今天,让我们踏上一段奇妙的旅程,探索Linux基础I/O中那些看似平凡却蕴含无限智慧的链接与库。

2303_81060385的博客 2705

Linux 文件 IO 管理(第四讲:软硬链接和动静态库)

Linux 文件 IO 管理(第四讲:软硬链接和动静态库)

2302_77289177的博客 1101

深入浅出动静态库

当你在Linux系统上编写和运行程序时,动态库和静态库是两个非常重要的概念。它们不仅影响着程序的编译和执行效率,还直接关系到程序的可移植性和灵活性。

欢迎来到阿熊的blog~~ 1250

【Linux】软硬链接与动静态库

看了这篇文章你将学到软硬链接的使用,以及制作自己的动静态库,并使用他们✨✨

Lin_Alpaca的博客 5729

软硬链接与动静态库

简单来说:库是一些可重定向的二进制文件,这些文件在链接时可以与其他的可重定向的二进制文件一起链接形成可执行程序。一般来说库被分为静态库和动态库,他们是有不同的后缀来进行区分的。系统平台静态库动态库Windows.lib.dllLinux.a.so对于C/C++来说其库的名称也是有规范要求的,例如在Linux下:一般要求是lib + 库的真实名称 +(版本号)+ .so /.a + (版本号),版本号是可以省略不写的。

2301_79991997的博客 1202

Linux软硬链接和动静态库(20)

我有款非常喜欢玩的游戏,叫做《饥荒》,现在我下载了这一款游戏,但我不会跑到游戏所在目录中双击 .exe 打开游戏,大多数人都会通过桌面的快捷方式直接打开文件,而这个快捷方式实际就是对 .exe 的 软链接 文件;当你在游戏中加载地图、道具等资源时,这些数据是存在 .exe 文件中的吗?答案是当然不是,这些资源文件都以 库 的方式与 .exe 位于同一目录中,通常为动态库,在 Windows 中后缀为 dll,那么这些神奇的辅助文件是如何产生的?其本质又是如何?本篇将带你一起揭晓。

tan180°的博客 1310

【Linux】软硬链接、动静态库

一文带你由浅入深掌握软硬链接、动静态库!

m0_74808907的博客 3263

Linux——软硬链接与动静态库

建立软链接的命令:例如我们以给一个文件建立的软链接为例,看看这个软链接和被建立链接的文件有什么不同:可以发现,当我们查看二者的inode时,它们的inode编号是不一样的,这说明了以下几点:那么,软链接存放的究竟是什么呢?通过上面的分析,可以得出结论:同时,我们发现,上面的快捷方式指向的文件实际是在,而一般来说,放在电脑桌面的快捷方式是存放在的,而同样在Linux——磁盘文件中提到过,一个分区就是一个文件系统,因此又可以得出一个结论:建立硬链接的命令:例如:同样,我们来查看硬链接和被链接文件的:可以看到,硬

Forward♞的博客 1085
上一篇: Linux相关概念和易错知识点(20)(dentry、分区、挂载)
下一篇: Linux相关概念和易错知识点(22)(ELF格式、可执行程序的加载、共享库)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值