当前位置: 首页 > news >正文

基础IO(三)

软硬链接和动静态库

  • 1.软硬链接
  • 2.动态库和静态库
    • 2.1理解现象
    • 2.2静态库的设计
    • 2.3动态库
    • 2.4动态库的配置
    • 2.5动态库的理解

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Linux的学习】
📝📝本篇内容:软硬链接;动静态库
⬆⬆⬆⬆上一篇:基础IO(二)
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-

1.软硬链接

①软链接是一个独立的链接文件,有自己的inode编号,因此也有自己的inode属性和内容,其内容是自己所指向的文件的路径,类似于windows快捷方式
创建软链接命令:ln -s
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
②硬链接和目标文件共用同一个inode编号,因此硬链接一定和目标文件使用同一个inode(属性)。硬链接没有独立的inode,在当前目录的内容中建立新的文件名和老的inode的映射关系
创建硬链接的命令:ln
在这里插入图片描述
仔细观察红色圈出来的地方,为什么它是2?
其实它指的是硬链接数,在inode属性中有一个来变量记录这个
在这里插入图片描述
在这里插入图片描述
大家注意看红色圈出来的地方,其中创建一个dir目录后,它的硬链接数为2,这是因为它本身是一个,再加上其内部的 . .,用来切换到上一级路径,也是指向这个目录,因此为2,。而这个目录中的 . 为3个硬链接数的原因是本身一个,上一级目录下它本身的目录名算一个,再者dir中有一个. .切换到上级目录也算一个。
但是只有OS能给目录建立硬链接,因为我们自己建立的容易造成环路路径问题(例如使用find,会引起死循环)

2.动态库和静态库

系统已经预装了C/C++的头文件和库文件,头文件是提供方法说明,库提供方法的实现,头和库是有对应关系的,是要组合在一起使用的
头文件是在预处理阶段就引入的,链接本质其实是链接库
查看C动态库:/usr/lib64/libc* 或 /lib64/libc*
在这里插入图片描述
在这里插入图片描述

查看C++动态库:/usr/lib64/libstdc* 或 /lib64/libstdc*
在这里插入图片描述
在这里插入图片描述

查看头文件:/usr/include
在这里插入图片描述

2.1理解现象

a.所有,我们在VS2019/2022下安装开发环境——安装编译器软件,安装要开发的语言配套的库和头文件
b.我们在使用编译器,都会有语法的自动提醒功能,需要包含头文件的。语法的提醒本质:编译器或编辑器,它会自动的将用户输入的内容,不断在被包含的头文件中进行搜索,自动提醒功能是依赖头文件的
c.我们在写代码的时候,我们的环境怎么知道我们的代码中有哪些地方有语法报错?其实是有命令行模式,还有其他自动化的模式帮我们不断在进行语法检查
d.库:静态库(.a);动态库(.so)
e.库名:lib stdc++.so.6
f.一般云服务器,默认只会存在动态库,不存在静态库,静态库需要单独安装

2.2静态库的设计

我们首先写一个函数的实现
在这里插入图片描述
再写一个普通的.c文件,其中包含了函数原型的头文件

在这里插入图片描述
在这里插入图片描述
此时我们再考虑一个问题,当我们的c文件在编译时,只要有函数的声明就不会出现报错,因为编译器认为,在后面链接的时候能够找到对应的实现,也就说到链接阶段时,.c文件已经变成了.o文件。因此我们可以认为我们的静态库里内容也应该为.o再被封装。
静态库设计命令:ar -rc libxxxx.a xxx.o
在这里插入图片描述
当我们有了库,接下来就要将库引入我们的项目,必须让编译器找到头文件和库文件
第三方库的使用:
①需要指定的头文件和库文件
②如果没有默认安装到系统gcc、g++默认的搜索路径下,用户必须指明对应的选项,来告诉编译器:a.头文件在哪 b.库文件在哪 c.库文件具体是谁
在这里插入图片描述
③将我们下载下来的库和头文件,拷贝到系统默认路径下——linux下安装库,对任何软件而言,安装和卸载的本质就是拷贝到系统特定的路径下
④如果我们安装的库是第三方的(除语言、操作系统接口)库,我们要正常使用,即便是已经全部安装到了系统中,g++/gcc必须要用-l指明具体库的名称
理解现象:
无论你是从网络中直接下好的库,或者是源代码(编译方法)——>make install 安装的命令——>cp,安装到系统中,我们安装大部分指令、库等都需要sudo或root操作

2.3动态库

在形成动态库时,我们的.o文件不能再是普通的二进制,而是与位置无关码
在这里插入图片描述
在这里插入图片描述
上图是生成动态库的命令
在这里插入图片描述
可是为什么生成了可执行程序执行不了呢,这是因为仅仅是把动态库告诉了编译器,并没有告诉OS。OS运行的时候,因为.so并没有在系统的默认路径下,所以OS找不到。而静态库的链接原则是将用户使用的二进制代码直接拷贝到目标可执行程序中,而动态库不会

2.4动态库的配置

①环境变量:LD_LIBRARY_PATH(临时方案)
在这里插入图片描述
②软链接
在这里插入图片描述
在这里插入图片描述
③配置文件方案
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5动态库的理解

静态链接形成的可执行程序本身就有静态库中对应的方法实现,但是静态链接非常占用资源(磁盘、可执行程序体积变大、加载占用内存、下载周期变长、占用网络资源)
在这里插入图片描述
其中我们要先明白,代码数据本身就是在物理内存上的,之后在通过映射到虚拟地址空间
我们的可执行程序中的并没有函数的实现,只有函数的地址,就如上图的例子,进程A中有一个add函数,他只有一个地址,当运行进程A时,创建task_struct,并且有了虚拟地址空间,此时进程A中由于使用了math这个动态库,因此把add函数加载到内存中,并映射到内存映射区(共享区),当我们把库加载到内存,映射到进程的地址空间后,我们的代码执行库中的方法,就依旧还是在自己的地址空间内进行了函数跳转。
但是我们这样做必定会遇到一个问题:不同的进程,运行程度不同,当加载好几个进程,需要使用的第三方库是不同的,注定了每一个进程的共享空间中空闲位置是不确定的。因此地址分为绝对编址和相对编址,动态库中的所有编址,都是偏移量,默认从0地址开始。当一个库,真正的被映射进地址空间的时候,它的起始地址才能真正确定,所谓之前提到的于位置无关码,其实就是动态库中地址都是偏移量
补充:①动态库和静态库同时存在,系统默认采用动态链接
②编译器,在链接的时候,如果提供的库既有动又有静,优先动,只有静,没法,只能静态链接

🌸🌸基础IO(三)的知识大概就讲到这里啦,博主后续会继续更新更多Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

相关文章:

基础IO(三)

软硬链接和动静态库 1.软硬链接2.动态库和静态库2.1理解现象2.2静态库的设计2.3动态库2.4动态库的配置2.5动态库的理解 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Linux…...

如何用国产DBDesginer软件进行数据库建模设计?

我们在开发软件系统之前都需要进行数据结构的建模设计,传统的都是通过PowerDesiger等国外的软件或直接Excel来进行数据库表结构设计,今天来了解一下如何使用国产软件来进行数据库建模设计 1、首先是注册DBDesigner用户( http://dbdesigner.n…...

精选 100 种最佳 AI 工具大盘点

为了应对对精简流程和数据分析日益增长的需求,整合人工智能工具在多个领域变得至关重要。 本文精选了2023年可用的100种最佳人工智能工具,旨在提高您的生产力、创造力和效率。 以下是 2023 年排名前 100 的人工智能工具: Aidoc:A…...

Recognizing Micro-Expression in Video Clip with Adaptive Key-Frame Mining阅读笔记

本文主要贡献 据我们所知,这是第一项旨在将视频剪辑中的信息时间子集的端到端学习与单个网络中的微表情识别相结合的工作。 此外,所提出网络中所有模块的设计都与输入视频剪辑的长度无关。 换句话说,网络容忍各种长度的微表情剪辑。 本文的贡…...

【SpringBoot整合RabbitMQ(上)】

一、简单的生产者-消费者 1.1、创建连接工具类获取信道 public class RabbitMqUtils {public static Channel getChannel() throws IOException, TimeoutException {//创建一个链接工厂ConnectionFactory factory new ConnectionFactory();//工厂IP 链接RabbitMQ的队列facto…...

Linux 设备驱动程序(二)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux设备驱动开发详解 文章目录 系列文章目…...

性价比提升15%,阿里云发布第八代企业级计算实例g8a和性能增强型实例g8ae

5 月 17 日,2023 阿里云峰会常州站上,阿里云正式发布第八代企业级计算实例 g8a 以及性能增强性实例 g8ae。两款实例搭载第四代 AMD EPYC 处理器,标配阿里云 eRDMA 大规模加速能力,网络延时低至 8 微秒。其中,g8a 综合性…...

Unity VR开发教程 OpenXR+XR Interaction Toolkit 番外(一)用 Grip 键, Trigger 键和摇杆控制手部动画

文章目录 📕制作手部动画📕设置 Animation Controller📕添加触摸摇杆的 Input Action📕代码部分 在大部分 VR 游戏中,手部的动画通常是由手柄的三个按键来控制的。比如 Grip 键控制中指、无名指、小拇指的弯曲&#xf…...

H.265/HEVC编码原理及其处理流程的分析

H.265/HEVC编码原理及其处理流程的分析 H.265/HEVC编码的框架图,查了很多资料都没搞明白,各个模块的处理的分析网上有很多,很少有把这个流程串起来的。本文的主要目的是讲清楚H.265/HEVC视频编码的处理流程,不涉及复杂的计算过程。…...

数据结构初阶--链表OJⅡ

目录 前言相交链表思路分析代码实现 环形链表思路分析代码实现 环形链表Ⅱ思路分析代码实现 复制带随机指针的链表思路分析代码实现 前言 本篇文章承接上篇博客,继续对部分经典链表OJ题进行讲解 相交链表 先来看题目描述 思路分析 这道题我们还是首先来判断一…...

离职or苟住?

面对不太好的大环境,我们什么时候该离职,什么时候不应该离职呢?分享几个观点,希望对你有所启发。 以前就有大佬讲过,离职无非是两个原因,一是因为薪资不到位,二是因为受委屈了,总之&…...

微服务之以nacos注册中心,以gateway路由转发服务调用实例(第一篇)

实现以nacos为注册中心,网关路由转发调用 项目版本汇总项目初始化新建仓库拉取仓库项目父工程pom初始化依赖版本选择pom文件如下 网关服务构建pom文件启动类配置文件YMLnacos启动新建命名空间配置网关yml(nacos)网关服务启动 用户服务构建pom文件启动类配置文件YML新增url接口配…...

主成分分析(PCA)直观理解与数学推导

近期在完成信息论的作业,发现网上的资料大多是直观解释,对其中的数学原理介绍甚少,并且只介绍了向量降维,而没有介绍向量重构的问题(重构指的是:根据降维后的低维向量来恢复原始向量)&#xff0…...

什么是合伙企业?普通合伙和有限合伙区别?

1.什么是合伙企业? 合伙企业是指由各合伙人订立合伙协议,共同出资,共同经营,共享收益,共担风险,并对企业债务承担无限连带责任的营利性组织。合伙企业一般无法人资格,不缴纳企业所得税,缴纳个…...

系统结构考点之不明白的点

系统结构考点系列 计算机系统结构的定义计算机组成的定义计算机实现的定义计算系统的定量设计?1. 哈夫曼压缩原理2. Amdahl定律3. cpu性能公式4. 程序访问局部性定理 ​ 这样的题已经不多了,主要是要了解下概念。打下一个好的基础。 2023年4月份成绩已经…...

Android中AIDL的简单使用(Hello world)

AIDL:Android Interface Definition Language(Android接口定义语言) 作用:跨进程通讯。如A应用调用B应用提供的接口 代码实现过程简述: A应用创建aidl接口,并且创建一个Service来实现这个接口&#xff08…...

ZED使用指南(五)Camera Controls

七、其他 1、相机控制 (1)选择视频模式 左右视频帧同步,以并排格式作为单个未压缩视频帧流式传输。 在ZED Explorer或者使用API可以改变视频的分辨率和帧率。 (2)选择输出视图 ZED能以不同的格式输出图像&#xf…...

wrk泛洪攻击监控脚本

wrk泛洪攻击介绍 WRK泛洪攻击(WRK Flood Attack)是一种基于WRK工具进行的DDoS攻击(分布式拒绝服务攻击)。WRK是一个高度并行的HTTP负载生成器,可以模拟大量用户访问一个网站,从而导致该网站服务器瘫痪或失效…...

软件I2C读写MPU6050代码

1、硬件电路 SCL引到了STM32的PB10号引脚,SDA引到了PB11号引脚软件I2C协议: 用普通GPIO口,手动反转电平实现协议,不需要STM32内部的外设资源支持,故端口是可以任意指定MPU605在SCL和SDA自带了两个上拉电阻,…...

销售/回收DSOS254A是德keysight MSOS254A混合信号示波器

Agilent DSOS254A、Keysight MSOS254A、 混合信号示波器,2.5 GHz,20 GSa/s,4 通道,16 数字通道。 ​Infiniium S 系列示波器 信号保真度方面树立新标杆 500 MHz 至 8 GHz 出色的信号完整性使您可以看到真实显示的信号&#xff1…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...