基础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 键控制中指、无名指、小拇指的弯曲…...

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

什么是合伙企业?普通合伙和有限合伙区别?
1.什么是合伙企业? 合伙企业是指由各合伙人订立合伙协议,共同出资,共同经营,共享收益,共担风险,并对企业债务承担无限连带责任的营利性组织。合伙企业一般无法人资格,不缴纳企业所得税,缴纳个…...
系统结构考点之不明白的点
系统结构考点系列 计算机系统结构的定义计算机组成的定义计算机实现的定义计算系统的定量设计?1. 哈夫曼压缩原理2. Amdahl定律3. cpu性能公式4. 程序访问局部性定理 这样的题已经不多了,主要是要了解下概念。打下一个好的基础。 2023年4月份成绩已经…...

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

ZED使用指南(五)Camera Controls
七、其他 1、相机控制 (1)选择视频模式 左右视频帧同步,以并排格式作为单个未压缩视频帧流式传输。 在ZED Explorer或者使用API可以改变视频的分辨率和帧率。 (2)选择输出视图 ZED能以不同的格式输出图像…...
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 出色的信号完整性使您可以看到真实显示的信号࿱…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...