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采用局部性静态链接。
​​​​​​​

部署与可视化系统:零基础到精通:LabVIEW 调用 YOLO 动态链接库(DLL)的保姆级视觉检测系统融合实战 LabVIEW与YOLO26深度集成:工业视觉检测新范式 本文揭示了LabVIEW与最新YOLO26模型深度集成的创新方案,通过C++封装ONNX Runtime为DLL,在LabVIEW中实现端到端视觉检测。核心突破点包括: 技术选型:对比YOLOv5/YOLOv8/YOLO26性能,YOLO26在CPU推理速度提升43%,支持NMS-Free端到端推理 部署架构:提供ONNX Runtime C++ API和TensorRT两种DLL封装路径,适配不同硬件环境 工程实现:详细展示从PyTorch模型导出 阅读详情

相关推荐

高分7(GF7)卫星数据制作平原地区DSM/DEM(三)——可信度分割

李国春(接上)

副组长的博客 1714

Linux:软硬链接及动静态库

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

2201_75880188的博客 1426

SAP批量数据导入实战:BDC、CATT、LSMW三大工具保姆级对比教程

本文深入对比了SAP系统中三大批量数据导入工具BDC、CATT和LSMW的核心定位、适用场景与实战操作。BDC适合复杂逻辑的编程式处理,CATT适合业务用户快速录制回放,LSMW则是数据迁移项目的结构化首选。文章提供了详细的选型决策框架、性能优化技巧及常见陷阱规避指南,帮助SAP顾问和开发者高效完成数据批量维护任务。

weixin_29213525的博客 151

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

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

blue_jun_的博客 1824

存内计算路线再获加持,清华存内芯片登Science

通过这种方法,可以比较有效的控制二氧化铪忆阻层中的微观变化,以及内部的温度和电场,使得器件具有非常优异的电学特性,而且可以在工厂里大规模生产,推动了高性能忆阻器阵列的诞生。团队搭建了全硬件构成的完整存算一体系统,如下图7所示,在系统里集成了多个忆阻器阵列,并在该系统上高效运行了卷积神经网络算法,成功验证了图像识别功能,证明了存算一体架构全硬件实现的可行性,并且成功实现了以更小的功耗和更低的硬件成本完成复杂的计算[6]。根据测试,在一般神经网络中权重更新的最后阶段,调整步长非常接近0,如图9(C)所示,

PXX12345678的博客 1555

Ubuntu系统下USB无线网卡无法识别的解决方案

Realtek的USB设备可能是无线网卡、有线网卡、读卡器等,系统仅知道“这是Realtek的USB设备”,但不知道“如何将其作为无线网卡驱动”。通过以上步骤,RTL8812AU 芯片的 Edimax 无线网卡应能被 Ubuntu 识别并正常工作。Realtek等品牌的无线网卡可能被系统简单识别为"USB设备",但未匹配到对应的无线驱动,导致设备无法发挥网络功能。是系统识别了USB设备,却未正确加载无线网卡驱动。(前4位是厂商ID,后4位是产品ID),显示设备已识别,但网络管理工具无反应,

极地星辰 3462

Linux 软连接和硬链接

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

MyySophia的博客 6669

MediaPipe实战:从零构建人脸关键点检测应用

本文详细介绍了如何使用Google的MediaPipe框架从零构建一个实时人脸关键点检测应用。文章深入剖析了MediaPipe的三段式检测流水线,提供了Android平台的完整实战教程,包括环境配置、模型加载、摄像头集成、关键点绘制以及性能调优指南,帮助开发者快速实现高效、跨平台的人脸AR特效与交互功能。

weixin_29100927的博客 341

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

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6752

AFSim插件开发实战:从环境搭建到功能扩展

本文详细介绍了AFSim插件开发的完整流程,从环境搭建到功能扩展,涵盖了SDK配置、插件创建、核心代码解析、功能扩展实战、调试优化以及高级开发技巧。通过实战案例和实用技巧,帮助开发者快速掌握AFSim插件开发,提升仿真系统的扩展性和灵活性。

weixin_29309475的博客 576

Linux软硬链接和动静态库

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

ARMCSKGT的博客 5273

OpenClaw简介--windows系统安装OpenClaw

在windows安装OpenClaw实现代替人工操作。步骤流程详细,图文并茂。

直到世界的尽头 5348

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

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

石墨博客 1640

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

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

hffh123的博客 1819

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

其中的。

2401_83603768的博客 1207

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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、付费专栏及课程。

余额充值