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

news2025/1/29 13:50:45

目录

软硬链接

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.o
	ar -rc libmylib.a add.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:subc
	gcc -c sub.c -o sub.o

.PHONY:output
output:
	mkdir -p myliba/include
	mkdir -p myliba/lib 
	cp -f *.h myliba/include
	cp -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.coloradmin.cn/o/1977605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion绘画 | 文生图-高分辨率修复-Hires.fix

开启「高分辨率修复」的作用是&#xff0c;提高图片分辨率&#xff0c;增加细节&#xff0c;从而让画面变得更清晰。 之所以不采取直接通过调整宽高来提高分辨率&#xff0c; 是因为绝大多数模型在训练时&#xff0c;精度都是 512x512&#xff0c;如果生成图片时&#xff0c;直…

云仓酒庄新纪元:雷盛红酒LEESON 401澳洲赤霞珠盛大发布

云仓酒庄新纪元&#xff1a;雷盛红酒LEESON 401澳洲赤霞珠盛大发布 在全球酒业市场的激烈竞争中&#xff0c;云仓酒庄始终以其敏锐的市场洞察力和卓越的产品品质引领行业潮流。近日&#xff0c;云仓酒庄宣布其精心筹备的雷盛红酒LEESON 401系列——澳洲原瓶进口赤霞珠正式上线…

API 接口设计原则:RESTful 与 GraphQL

RESTful 接口 REST 的全称是 REpresentational State Transfer&#xff0c;是一种 Web API 的设计风格 RESTful API 设计 6 大原则 一个 RESTful 风格的接口应该满足如下的 6 点原则&#xff1a; 统一接口&#xff1a;For example, the HTTP-based REST APIs make use of th…

小巧免费的笔记本电池检测工具

BatteryInfoView是一款免费的笔记本电池检测软件&#xff0c;适用于笔记本电脑和上网本。该软件能够提供电池的详细信息&#xff0c;包括电池名称、制造商名称、序列号、制造日期、电源状态&#xff08;充电/放电&#xff09;、当前电池容量、完全充电容量、设计容量、充电放电…

区块链核心概念与技术架构简介

引言 区块链&#xff0c;一种分布式账本技术&#xff0c;不仅为数字货币提供了基础设施&#xff0c;更在金融、供应链、物联网等多个领域展现出广泛的应用前景。区块链技术被认为是继蒸汽机、电力、互联网之后&#xff0c;下一代颠覆性的核心技术。 如果说蒸汽机释放了人们的…

Radxa ROCK 5B+开发板使用4G模块(移远EC200A)

目录 1、移远EC200A介绍2、ROCK 5B安装模组3、bsp编译内核4、使用4G模块拨号上网5、注意事项 前一篇博客&#xff1a;Radxa ROCK 5B开发板基本配置和上手测试 1、移远EC200A介绍 EC200A 系列是移远通信专为 M2M 和 IoT 领域设计的 LTE Cat 4 无线通信模块&#xff0c;采用 3G…

萱仔大模型学习记录5-langchain实战

前面我的bertlora微调已经跑出了不错的结果&#xff0c;我也学会了如何在bert上使用Lora进行微调&#xff0c;我后续会补充一个医疗意图识别的项目于这个系列&#xff0c;现在这个医疗意图识别代码还暂时不准备公开。我就继续按照我的计划学习一番LangChain。 LangChain是一个用…

yolov5 part2

two-stage &#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 one-stage &#xff08;单阶段&#xff09;&#xff1a;YOLO系列 最核心的优势&#xff1a;速度非常快&#xff0c;适合实时监测任务。但是缺点也有&#xff0c;效果可能不好 速度较慢在2018…

Http自定义Header导致的跨域问题

最近写一个小项目&#xff0c;前后端分离&#xff0c;在调试过程中访问远程接口&#xff0c;出现了CORS问题&#xff0c;接口使用的laravel框架&#xff0c;于是添加了解决跨域的中间件&#xff0c;但是前端显示仍存在跨域问题&#xff0c;以为自己写的有问题&#xff0c;检查了…

等待唤醒机制两种实现方法-阻塞队列

桌子上有面条-》吃货执行 桌子上没面条-》生产者制造执行 1、消费者等待 消费者先抢到CPU执行权&#xff0c;发现桌子上没有面条&#xff0c;于是变成等待wait状态&#xff0c;并释放CPU执行权&#xff0c;此时的CPU肯定会被厨师抢到&#xff0c;初始开始做面条&#xff0c;…

南京观海微电子----使用运算放大器过零检测器电路图

使用运算放大器的过零检测电路 过零检测电路是运算放大器作为比较器的一种应用。它用于跟踪正弦波形在越过零电压时从正变为负或从负变为正的变化。它也可以用作方波发生器。过零检测器有许多应用&#xff0c;如时间标记发生器、相位计、频率计数器等。过零检测器可以用多种…

基于FPGA的数字信号处理(22)--进位保存加法器(Carry Save Adder, CSA)

目录 1、拆解多个数的加法 2、进位保存加法器 3、CSA的优点和缺点 4、CSA电路的实现 文章总目录点这里&#xff1a;《基于FPGA的数字信号处理》专栏的导航与说明 1、拆解多个数的加法 考虑3个4bits数相加&#xff0c;10 4 7 21 的过程是这样的&#xff1a; 其中的红色数…

【树莓派】初始化配置(自动连wifi,自动开启SSH)换清华源,远程桌面连接

@TOC 【树莓派】初始化配置(自动连wifi,自动开启SSH)换清华源 一 .烧录系统 二 .自动连wifi,自动开启SSH 三.插电启动派 四.找到树莓派的IP,SSH连接(默认账密 pi:raspberry) 五.更改清华源 注意:按快捷键ctrl+x,会提示是否保存,按Y键确认即可 1.sudo nano /etc/apt/sourc…

java面向对象编程入门

一、前言&#xff1a; 在Java中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种核心的编程范式。Java的设计和开发都是基于面向对象的思想。面向对象编程的主要目的是提高代码的可重用性、灵活性和可维护性。以下是Java面向对象编程…

在windows本地机搭建gitlab

在windows本地机搭建gitlab 1. 解决方案2. docker安装gitlab2.1 下载Docker Desktop2.2 安装gitlab的docker2.3 配置gitlab网页2.3 配置gitlab配置文件 3. frp端口转发4. ssh密钥配置5. 运行 1. 解决方案 注&#xff1a;gitlab只有linux版本&#xff0c;并不存在windows版本&a…

小柴带你学AutoSar系列三、标准和规范篇(2)BSWGeneral

BSWDistributionGuide BSW在AUTOSAR架构中的这里哦 BSW Distribution in Multi-Core Systems BSW Functional Clusters BSW功能集群是一组相关功能的模块 BSW functional clusters are groups of functionally coherent BSW modules. The following types of clusters might…

如何搭建云电脑?让数据更安全。。。。。。

上周,微软Windows系统的蓝屏故障对各行各业造成了严重影响。航空业首当其冲,当天所有航班停飞,人员滞留在机场。 酒店业也未能幸免,同样受到波及。 1. 故障分析及解决措施 本次蓝屏事件的导火索是CrowdStrike公司更新的驱动程序。CrowdStrike提供的解决方案相当复杂,用户需要…

JavaFX布局-ScrollPane

JavaFX布局-ScrollPane 常用属性paddingcontentvbarPolicyhbarPolicyfitToWidthfitToHeight 实现方式Java实现 一个容器组件&#xff0c;用于展示那些可能超出窗口尺寸的内容当内容超过容器的大小时&#xff0c;会自动出现滚动条 常用属性 padding 内边距&#xff0c;可以单独…

【开源分享】PHP在线提交工单源码|工单管理系统源码 (附源码搭建教程)

一、设备报修工作内容 1.工单管理&#xff1a;设备报修系统可以将设备故障统计为工单并对工单进行汇总管理。将工单数据进行归类&#xff0c;将故障分类进行查看、统计、分析等等。 2.设备状态&#xff1a;工单可通过用户上报设备状态数据进行查看&#xff0c;维修工程师在维…