【Linux详解】基础IO:软硬连接 | 动静态库管理

目录

软硬链接

1. 介绍

2.理解

2.1 如何理解硬链接?

2.2 如何理解软连接?

动静态库

1.介绍

1.1 使用

1.2 什么是库?

2.生成

2.1 静态库

2.2 动态库:


软硬链接

1. 介绍

1.1 软连接

是一个独立文件,具有独立的 inode ,也有独立的数据块,它的数据块里面保存的是指向的文件的路径公用 inode

建立软连接

ln -s myfile.txt soft_file.link

1.2 硬链接

硬连接的 inode 是一样的,不是一个独立的文件,本质其实就是在特定目录的数据块中新增,文件名和指向的文件的 inode 编号的映射关系!!

ln 建立连接,由后者指向前者,硬链接数

观察 inode 编号可以发现,软硬链接的区别:是否具有独立的Inode

软链接具有独立的Inode:可以被当作独立的文件看待。

2.理解

2.1 如何理解硬链接?

任意一个文件,无论是目录,还是普通文件,都有 inode

每一个 inode 内部,都有一个叫做引用计数的计数器,有多少个文件名指向我

通常用来进行路径定位,采用硬链接,可以进行目录间切换

硬链接没有独立的Inode,那硬链接该如何理解呢?或者建立一个硬链接究竟是做了什么?

通过实践我们可以发现,创建目录会发现硬链接数会增加

在目录当中的运用

删文件就是解除映射关系,连接数--

这就是为什么硬链接不会一次被删除

应用场景

一个. 表示当前目录,inode 是一样的,相当于在另一个场景下的重命名,..为 3,返回的是上级路径的 inode

eg: / 硬链接数为 21,可知旗下有 19 个目录

❓ linux 不允许对目录硬链接,为什么?

如下图:

那为什么目录内部有./..,不是目录的硬链接吗??

系统搜索时,并没有调用./..,诞生相对路径是为了方便搜索,也是当前目录的内容,相当于这个的硬链接是由系统设计好了的


2.2 如何理解软连接?

特别像我们在 windows 当中的创建快捷方式路径直接跳转

🗝️ 为什么要有?

上线了一个软件,要给客户看,可执行程序 exe 路径太深了,这时候可以通过提出来 ln -s ,形成软连接,就能直接 test.exe ,不带路径执行啦

软链接有自己独立的Inode和内容,当我们删除myfile.txt,软链接就出错,但是我们知道Inode还在。换一个角度思考,怎么不算是一种置后的重命名

软链接里面保存的是与文件所处路径的映射关系


当把文件删除时,这个映射关系就出错了。unlink 的使用

注:对文件的权限最终解释权归目标文件,软连接不能影响

软连接可以和之后的动态库结合使用


动静态库

1.介绍

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

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

各自缺点:
动态库:受到库升级或被删除等影响
静态库:形成可执行程序太大

命名:例如动态库 libxxx.so
lib前缀 .so后缀 去掉前缀和后缀,剩下的就是库名称

1.1 使用

在Linux中,动态链接和静态链接是链接器在编译程序时使用库的不同方式。动态链接器在运行时加载共享库(通常带有 .so 后缀),而静态链接器在编译时将库的代码直接合并到可执行文件中(通常带有 .a 后缀)。以下是对您提供内容的格式化:

在Linux中使用GCC编译静态链接的可执行文件

命令行示例
gcc test.c -o mytest -static
注意
  • 如果系统中只提供.so文件,则只能使用动态链接。
  • 如果只提供.a文件,即使不指定-static,也是静态链接。
  • 如果动态库和静态库都存在,默认使用动态库。
安装C静态库
sudo yum install -y glibc-static
安装C++静态库
sudo yum install -y libstdc++-static
关于Linux的动静态库问题
  • 在Windows下,原理是一样的。
  • 默认形成可执行程序:动态链接
  • Windows下动态库后缀为.dll,静态库后缀为.lib
  • 注意:系统本身为了支持编程,除了提供标准库.h,还提供了标准库的实现.so/.a

1.2 什么是库?

程序在经过预处理,编译,汇编,之后,就要链接了,链接就是将.o文件和库链接起来形成可执行程序。

下面我们将演示类似与库的思想。

vim 小技巧:

在 Vim 编辑器中,使用 :vs(vertical split)命令可以创建一个垂直分割的窗口。若要在这两个窗口之间切换,可以使用下面方法:在 Vim 中,Ctrl + w 是一个前缀键,用于执行与窗口相关的操作,而 jkhl 键用于指定方向

库的连接

下面是一个简单的示例,展示了如何编写一个 add 函数,并且如何将它们编译成目标文件(.o 文件),最后将这些目标文件链接起来形成一个可执行文件。
首先,我们需要创建 2 个源文件:

  1. my_add.c - 包含 add 函数的实现。
  2. main.c - 包含 main 函数,用于调用 add 函数。

my_add.c

// my_add.c
int add(int a, int b) {return a + b;
}

main.c

// main.c
#include <stdio.h>
extern int add(int a, int b);
int main() {int a = 10;int b = 5;printf("Add: %d + %d = %d\n", a, b, add(a, b));    return 0;
}

extern 告诉编译器 add 函数存在,但它的定义(函数体)在其他地方

现在,我们将这些源文件编译成目标文件,并链接它们来创建一个可执行文件。

编译和链接步骤

在 Linux 命令行中执行以下命令:

gcc -c my_add.c -o my_add.o  # 编译 my_add.c 到 my_add.o
gcc -c main.c -o main.o      # 编译 main.c 到 main.o
gcc -o mymath main.o my_add.o # 链接 main.o, my_add.o 到 mymath

最后,运行可执行文件 mymath

./mymath

这应该会输出:

这样,我们就测试了 Linux 下的 GCC 编译器如何将 .o 文件链接起来形成可执行文件。

2.生成

2.1 静态库

为了将上诉代码接口给同学使用,并且不暴露源码,此时我们就可以选择将它制作成库。

制作如下:

可以先将.h 和.c 打包成 .o

库的原理和上面类似,只是将所有的.o为后缀的文件打包在了一起,形成了一个库,在使用的时候直接使用这个库就可以。

  • 指令:ar -rc libname.a [所有待打包.o]
  • 作用:将所有待打包的.o文件制作成静态库。

该指令中,ar是gnu的归档工具(Archive files),rc表示replace和create。

❗ 方法 2: 一步到位

libmylib.a:add.oar -rc libmylib.a add.o
add.o:add.cgcc -c add.c -o add.o
sub.o:subcgcc -c sub.c -o sub.o.PHONY:output
output:mkdir -p myliba/includemkdir -p myliba/lib cp -f *.h myliba/includecp -f *.a myliba/lib 
.PHONY:clean
clean:rm -rf *.o libmylib.a myliba

我们可以写一个这样的Makefile,直接一步make到位,生成一个库文件。

  • 将所用到的头文件全部放在myliba/include目录下。
  • 将静态库文件放在myliba/lib目录下。

可以通过指令来查看我们制作的库

  • 指令:ar -tv 库文件名
  • 功能:列出静态库中的文件和详细信息。

再使用打包工具tar,将库和头文件一起打包,如上图所示,将压缩包发生给同学。

此时我们的库就制作成了。

使用静态库:

此时我们站在使用者的角度,也就是那个同学的角度。

  1. 安装在系统中
  • 头文件默认搜索路径:/usr/include;
  • 库文件默认搜索路径:/usr/lib64;

gcc不知道该用这个默认路径下的哪个库,要告诉编译器使用该库

在使用gcc编译的时候告诉编译器要使用的库名(掐头去尾后的库名),此时就能编译成功了,而且成功调用了同学给我们的库。

  • -l选项:指定使用的库名(掐头去尾后的库名)
  • 注意:l可以和名字合在一起,如-lmylib。

这种方式不建议使用,因为第三方库没有经过检测,会污染其他库和头文件。

比较好的是下一种方式。

  1. 告诉编译器头文件路径,库路径,库名

选项

作用

-I(大写i)

指定头文件路径

-L

指定库文件路径

-l(小写L)

指定库(掐头去尾后的库名)

这样一来,一个第三方库就可以正常使用了。

2.2 动态库:

  1. 形成位置无关码

选项

作用

-fPIC

生成位置无关码

-shared

生成动态库

位置无关码就类似于箭头右侧30米处的30。 本质上它是一个偏移量,相对于库基地址的偏移量。

如果这不是100米的跑道,而是变成了200米,500米呢?星星的绝对位置会变化,但是它的相对位置永远不变,处于箭头右侧30米处

2. 形成库文件

  • 我们将头文件路径,库文件路径,库文件名告诉了gcc。
  • 编译完成以后,和gcc就没有关系了,接下来的执行是操作系统的事情。
  • 那么操作系统就必须得知道所使用的动态库在哪里。所以我们可以进行如下操作

每次启动shell的时候,它都会从配置文件中重新加载环境变量,我们这里给LD_LIBRARY_PATH赋值只是暂时的

方法二:软链接到系统默认搜索路径中

/usr/lib64 这个系统默认搜索库路径下,有很多的库文件,还有很多的软链接库文件,我们可以自主来实现链接

将同学给我们的动态库软链接到系统默认搜索路径下,如上图所示。此时系统就能找到库啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/390988.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python机器学习】支持向量机——利用完整platt SMO算法加速优化

在几百个数据点组成的小规模数据集上&#xff0c;简化版SMO算法的运行是没有什么问题&#xff0c;但是在更大的数据集上的运行速度就会变慢。完整版的platt SMO算法应用了一些能够提速的启动方法。 platt SMO算法时通过一个外循环来选择第一个alpha值的&#xff0c;并且其选择…

内网穿透--ICMP隧道转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网&#xff0c;然后由于私网IP的缘故&#xff0c;公网无法直接访问内部web服务器主机。通过内网其它主机做代理&#xff0c;穿透访问内网web服务器主机边界路由器或防火墙做静态NAT映射访问内网服务器inux主机&#xff0c;且策…

MySQL的数据类型

文章目录 数据类型分类整型bit类型浮点类型字符串类型charvarchar 日期和时间类型enum和set find_ in_ set 数据类型分类 整型 在MySQL中&#xff0c;整型可以指定是有符号的和无符号的&#xff0c;默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的。 在MySQL中如…

Tree-of-Traversals:结合知识图谱与大模型,通过树遍历和回溯寻找高置信度推理路径

Tree-of-Traversals&#xff1a;结合知识图谱与大模型&#xff0c;通过树遍历和回溯寻找高置信度推理路径 Tree-of-Traversals算法解析对比 MindMap1. 与知识图谱&#xff08;KGs&#xff09;的整合2. 推理方法3. 灵活性与可扩展性4. 在医学诊断中的应用 速度和准确1. 速度2. 推…

第十一章:Kubernetes API服务器的安全防护

本章内容包括&#xff1a; 了解认证机制ServiceAccounts是什么及使用的原因了解基于角色(RBAC)的权限控制插件使用角色和角色绑定使用集群角色和集群角色绑定了解默认角色及其绑定 1 了解认证机制 在前面的内容中&#xff0c;我们说到API服务器可以配置一个到多个认证的插件(授…

数据结构链表2(常考习题1)(C语言)

移除链表元素&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 解题思路&#xff1a; 情况1&#xff1a; 情…

python dash框架

Dash 是一个用于创建数据分析型 web 应用的 Python 框架。它由 Plotly 团队开发&#xff0c;并且可以用来构建交互式的 web 应用程序&#xff0c;这些应用能够包含图表、表格、地图等多种数据可视化组件。 Dash 的特点&#xff1a; 易于使用&#xff1a;Dash 使用 Python 语法…

深入解析 KMZ 文件的处理与可视化:从数据提取到地图展示项目实战

文章目录 1. KMZ 文件与 KML 文件简介1.1 KMZ 文件1.2 KML 文件 2. Python 环境配置与依赖安装3. 代码实现详解3.1 查找 KMZ 文件3.2 解压 KMZ 文件3.3 解析 KML 文件3.4 可视化 KMZ 数据 4. 项目实战4.1. 数据采集4.2. 项目完整代码 5. 项目运行与结果展示6. 总结与展望 在处理…

将后台传来的数据,转成easyui-tree所需格式

easyui 中文文档 EasyUI Tree组件需要一个包含特定属性&#xff08;如id, text, children等&#xff09;的JSON对象数组来初始化。 而后台返回的数据&#xff0c;它可能不是我们直接能拿来用的。 方式一&#xff1a;使用loadFilter函数处理来自Web Services的JSON数据。 $(#…

功能实现——通过阿里云 OSS 实现文件管理

目录 1.需求分析2.阿里云 OSS 开通与配置2.1.登录阿里云官网2.2.搜索 OSS 服务并开通2.3.OSS 配置 3.在项目使用阿里云 OSS3.1.项目环境搭建3.2.代码实现3.2.1.将本地文件上传到阿里云 OSS3.2.2.将前端传入的文件上传到阿里云 OSS3.2.3.下载文件到本地2.3.4.流式下载3.2.4.OSSC…

本地部署文生图模型 Flux

本地部署文生图模型 Flux 0. 引言1. 本地部署1-1. 创建虚拟环境1-2. 安装依赖模块1-3. 创建 Web UI1-4. 启动 Web UI1-5. 访问 Web UI 0. 引言 2024年8月1日&#xff0c;blackforestlabs.ai发布了 FLUX.1 模型套件。 FLUX.1 文本到图像模型套件&#xff0c;该套件定义了文本到…

【收录率高丨最快会后3-4个月EI检索 | 往届均已EI检索】第四届光学与通信技术国际学术会议(ICOCT 2024,8月9-11)

欢迎参加第四届光学与通信技术国际学术会议&#xff08;ICOCT 2024&#xff09;&#xff0c;该会议将于2024年8月9-11日在南京举办。自2021年首次会议以来&#xff0c;ICOCT已经发展成为光学和通信领域较有影响力的国际会议之一&#xff0c;聚焦最前沿的技术进展与未来发展趋势…

【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)

Redis 的主从复制模式下&#xff0c;一旦主节点由于故障不能提供服务&#xff0c;需要人工进行主从切换&#xff0c;同时大量的客户端需要被通知切换到新的主节点上&#xff0c;对于上了一定规模的应用来说&#xff0c;这种方案是无法接受的&#xff0c;于是 Redis 从 2.8 开始…

“八股文“在现代编程面试中的角色重塑:助力、阻力还是桥梁?

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

AI人工智能开发环境配置

AI人工智能 为什么使用Python来开发AI 人工智能被认为是未来的趋势技术。 已经有了许多应用程序。 因此&#xff0c;许多公司和研究人员都对此感兴趣。 但是这里出现的主要问题是&#xff0c;在哪种编程语言中可以开发这些 AI 应用程序&#xff1f; 有各种编程语言&#xff0c…

Python 实现股票指标计算——LON

LON - 铁龙长线 1 公式 LC : REF(CLOSE,1); VID : SUM(VOL,2)/(((HHV(HIGH,2)-LLV(LOW,2)))*100); RC : (CLOSE-LC)*VID; LONG : SUM(RC,0); DIFF : SMA(LONG,10,1); DEA : SMA(LONG,20,1); LON : DIFF-DEA; LONMA : MA(LON,10); LONT : LON, COLORSTICK; 2 数据准备…

练题模块环境搭建

文章目录 1.数据库表设计1.practice_set 套卷2.practice_set_detail 套卷细节3.practice_info 练习信息4.practice_detail 练习详情5.E-R图 2.架构设计&#xff08;三层架构&#xff09;3.练题微服务架构搭建1.创建一个练题微服务模块1.创建一个maven项目2.把src删除&#xff0…

Halcon 二维匹配

匹配&#xff1a;在训练图像中呈现一个所谓的模板。系统从这个模板中派生出一个模型&#xff0c;通过使用该模型来定位于搜索图像中的相似模板对象。此方法能够处理打光、杂乱、位置和旋转变换的图像。 匹配优点&#xff1a;鲁棒性和灵活性。匹配不需要对目标进行任何形式的分割…

假期BUUCTF小练习3

文章目录 [极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5[HCTF 2018]admin第一种方法 直接登录第二种方法 flack session伪造第三种方法Unicode欺骗 [MRCTF2020]你传你&#x1f40e;呢[护网杯 2018]easy_tornadoSSTI注入 [ZJCTF 2019]NiZhuanSiWei [极客大挑战 2019]BuyFlag 一…

vmware虚拟机linux服务器的IP需要重启才能生效问题

vmware虚拟机linux服务器的IP需要重启才能生效问题 问题说明处理办法关闭&禁用网络管理 再次重启linux服务器&#xff0c;IP显示正常 问题说明 用vmware虚拟的linux服务器&#xff0c;配置了静态IP&#xff0c;但是每次重启liunx&#xff0c;IP都不是设置的静态IP&#xf…