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

news2024/11/18 4:25:04

目录

  • 一. 软硬链接
    • 1. 硬链接
    • 2. 软链接
    • 3. unlink
    • 4. 目录的硬链接
  • 二. 动静态库
    • 1.1 静态库制作
    • 1.2 静态库使用
    • 2.1 动态库制作
    • 2.2 动态库使用
    • 3. 动态链接原理

一. 软硬链接

1. 硬链接

硬链接(hard link) 可以将它理解为原始文件的别名, 和原始文件使用相同的 inode 编号和 data block.(inode 是文件在该磁盘分区内的唯一标识, 记录着文件的属性等内容; data block 是文件的内容)

可以使用 ln 指令为文件创建一个硬链接.

ln log.txt link.hard

在这里插入图片描述
当创建一个新的硬链接时, 该文件的硬链接数就会加 1; 删除一个文件时, 该文件的硬链接数就会减 1; 只有硬链接数为 0 时, 才会彻底删除该文件.

实际上, 硬链接文件和原文件是同一个, 所以 inode 和属性会和原文件相同, 并且当一个文件更改内容或属性时, 其他的文件也会随之改变.
在这里插入图片描述

  • 注:
    用户不可以使用硬链接 链接目录, 操作系统禁止这样的行为;
    硬链接不能跨分区对文件进行链接.(inode 只在分区内唯一)

2. 软链接

软链接 类似 Windows 系统下的快捷方式, 是一个的全新的文件, 并且文件类型为 ‘l’ (链接属性), 内容仅包括所含链接文件的路径名字.
所以软链接能够链接目录, 也能跨区链接; 但当删除或移动原始文件 或路径失效后, 链接文件也随之失效.

使用 ln -s 选项创建软链接

ln -s log.txt link.soft

在这里插入图片描述
软链接的文件属性, inode 和原文件都不相同, 并且 软链接文件会指向 (->) 源文件.

3. unlink

使用 unlink 指令可以删除链接文件, 也可以删除普通文件.(rm 指令类似, rm 指令也可以删除链接文件)

unlink /*file_name*/

在这里插入图片描述

4. 目录的硬链接

当新创建一个目录时, 硬链接数默认为 2.
在这里插入图片描述
因为一个新创建目录时不只在当前目录下创建了 test_dir 和 inode 的映射关系, 在 test_dir 目录中还会创建隐藏的 . 和 inode 的映射关系, 所以硬链接数会增加.
在这里插入图片描述
若在当前目录下再新建一个下级目录, 那么当前目录的硬链接数就会加 1, 因为下级目录中的 **..**也是当前目录的一个硬链接.

而操作系统不允许用户创建目录的硬链接, 是因为操作系统会将用户创建的目录认为是下级目录, 在遍历搜索文件等情况下, 会造成环路问题.

二. 动静态库

静态库是 文件在编译链接时使用静态链接, 把需要的库文件全部拷贝至可执行文件中, 可执行程序在运行时不依赖其他文件; 在 Linux 下后缀为 “.a”, 在 Windows 下后缀为 “.lib”.

动态库也被称为共享库, 可执行程序会在运行时动态链接 动态库, 多个可执行程序可以同时调用动态库; 动态库在 Linux 下后缀为 “.so”,在 Windows 下后缀为 “.dll”.

1.1 静态库制作

静态库就是将实现方法的源文件打包为一个文件.

先将源文件编译为 .o 文件
在这里插入图片描述
之后使用 ar 指令打包即可.

//ar [选项] [库名] [依赖文件]
ar -rc libFunc.a Add.o Sub.o	// -r replace, -c create  // -rc 创建或替换库文件

在这里插入图片描述

1.2 静态库使用

由于编译器默认不识别第三方的库文件, 直接编译会报错.
在这里插入图片描述
所以编译时需要将库文件的路径和文件名一起作为参数传入 gcc/g++ 中.

-I(大写 i) 表示头文件的路径
-L 表示库文件的路径
-l(小写 L) 表示库文件名
在这里插入图片描述

也可以直接将创建的头文件和库文件安装至系统目录中, 但并不推荐, 会污染系统的库目录.

2.1 动态库制作

动态库的制作和静态库类似, 不过动态库编译的源文件需要使用 -fPIC 选项, 表示产生位置无关码.
在这里插入图片描述
动态库打包依旧使用 gcc/g++, 使用 -shared 选项即可(表示生成共享库格式).
在这里插入图片描述

2.2 动态库使用

但由于动态库是运行时动态链接动态库的, 运行时会找不到动态库; 而静态库是编译时将静态库拷贝至可执行程序中的, 所以运行时不依赖文件.
在这里插入图片描述
解决方法:

  • 拷贝动态库的软链接或动态库本身 至 /lib64/ 目录下;
  • 设置环境变量 LD_LIBRARY_PATH, 可以将第三方动态库路径添加至此环境变量中(临时方案);
//										动态库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hhhhhan/Program/test1

在这里插入图片描述

  • 设置配置文件, 在 /etc/ld.so.conf.d/ 目录中的都是动态库配置文件, 可以在该目录创建配置文件 xx.conf (文件中存储动态库的路径), 使用 ldconfig 指令加载配置文件.
echo /home/hhhhhan/Program/test1/ > Test.conf
sudo mv Test.conf /etc/ld.so.conf.d/
sudo ldconfig

3. 动态链接原理

在可执行程序编译完成后, 可执行程序内库函数的地址并不是真正的地址, 而是库函数在动态库中的偏移量(相对地址), 是通过位置无关码 fPIC 生成的.

当可执行程序开始运行时, 若动态库没有在内存中, 操作系统会先将动态库加载至内存中; 然后通过页表建立映射关系, 将动态库加载至共享区中, 获得的动态库起始地址;

当可执行程序调用库函数时, 可执行程序会通过 动态库起始地址 + 偏移量 调用库函数.
在这里插入图片描述

动态链接解决了静态库空间浪费的问题, 可执行程序只需要保存库函数的偏移量, 在运行时通过动态库加载至共享区中的虚拟地址和页表的映射, 就可以调用库函数;
使得内存中只需要存在一份动态库, 就可以同时被多个可执行程序使用.

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

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

相关文章

GraphSage

背景 大型图中节点的低维嵌入在各种预测任务中非常有用。GraphSage是一种通用的归纳框架,它利用节点特征信息(例如,文本属性)有效地为以前看不见的数据生成节点嵌入。相比于对每个节点训练单独的嵌入,GraphSage学习了一…

深入浅出 -- 系统架构之单体到分布式架构的演变

一、传统模式的技术改革 在很多年以前,其实没有严格意义上的前后端工程师之分,每个后端就是前端,同理,前端也可以是后端,即Ajax、jQuery技术未盛行前的年代。 起初,大部分前端界面很简单,显示的…

thinkphp6入门(21)-- 如何删除图片、文件

假设文件的位置在 /*** 删除文件* $file_name avatar/20240208/d71d108bc1086b498df5191f9f925db3.jpg*/ function deleteFile($file_name) {// 要删除的文件路径$file app()->getRootPath() . public/uploads/ . $file_name; $result [];if (is_file($file)) {if (unlin…

【语音识别】声学建模中基于树的状态绑定

01 基本想法 单音素HMM模型不能很好的应对自然说话人发音时的渐变过程,比如从一个音素转换到另一个音素时会存在协同发音现象。因此语音识别的先驱者提出了上下文建模概念,即使用中心音素(单因素)和前后两个音素组成三音素对每一…

【Laravel】09 用模型批量赋值简化代码 数据库关系

【Laravel】09 用模型批量赋值简化代码 & 数据库关系 1. 用模型批量赋值简化代码2. 数据库关系 1. 用模型批量赋值简化代码 原来存储一个值 2. 数据库关系 这里可以看到两个SQL是一样的

函数重载和引用【C++】

文章目录 函数重载什么是函数重载?函数重载的作用使用函数重载的注意点为什么C可以函数重载,C语言不行? 引用什么是引用?引用的语法引用的特点引用的使用场景引用的底层实现传参时传引用和传值的效率引用和指针的区别 函数重载 什…

QT Creator概览

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:QT❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、Qt Creator 概览 ①:菜单栏 ②:模式选择 ③:构建套件选择器…

Vue2电商前台项目(二):完成Home首页模块业务

一、项目开发的步骤 1、书写静态页面(HTML,CSS) 2、拆分组件 3、获取服务器的数据动态展示 4、完成相应的动态业务逻辑 经过分析之后,Home首页可以拆分为7个组件:TypeNav三级联动导航,ListContainer&…

深入解析:如何使用Xcode上传苹果IPA安装包至App Store?

目录 引言 摘要 第二步:打开appuploader工具 第二步:打开appuploader工具,第二步:打开appuploader工具 第五步:交付应用程序,在iTunes Connect中查看应用程序 总结 引言 在将应用程序上架到苹果应用商…

【保姆级讲解如何安装与配置Node.js】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Arduino开发 esp32cam+opencv人脸识别距离+语音提醒

效果图 低于20厘米语音提醒字体变红 Arduino代码 可直接复制使用&#xff08;修改自己的WIFI) #include <esp32cam.h> #include <WebServer.h> #include <WiFi.h> // 设置要连接的WiFi名称和密码 const char* WIFI_SSID "gumou"; const char* …

【C语言】if语句选择题

前言 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 前言 关于if语句相关的选择题 题目一&#xff1a; 关于if语句说法正确是&#xff1a;( ) A .if语…

[StartingPoint][Tier1]Crocodile

Task 1 What Nmap scanning switch employs the use of default scripts during a scan? (哪些 Nmap 扫描开关在扫描期间使用默认脚本&#xff1f;) -sC Task 2 What service version is found to be running on port 21? 发现端口 21 上运行的服务版本是什么&#xff1f…

隐私计算实训营学习七:隐语SCQL的架构详细拆解

文章目录 一、SCQL Overview1.1 SCQL背景1.2 SCQL Overview 二、SCQL CCL三、SCQL架构 一、SCQL Overview 1.1 SCQL背景 SCQL&#xff1a;属于隐私计算BI范畴&#xff0c;允许多个互不信任参与方在不泄露各自隐私数据的条件下进行联合数据分析。 如下数据在不同机构&#xf…

CCleaner如何还原系统 CCleaner怎么恢复注册表 ccleaner官方下载

CCleaner是一款电脑清理软件&#xff0c;其中的注册表清理功能是该软件很重要的功能。注册表作为电脑的重要文件&#xff0c;不可以随便清理&#xff0c;而CCleaner可以帮我们安全&#xff0c;快速地清除注册表。同时&#xff0c;CCleaner还有还原系统的功能。下面将为大家介绍…

ST表(Segment Tree)

目录 1.概述 2.引入 3.ST表对引入的优化 1.概述 ST表是一种基于树形结构的数据结构&#xff0c;用于处理区间查询和更新操作。它通过预处理的方式将原始数据存储在树状结构中&#xff0c;以支持高效的区间查询。ST表的构建时间复杂度为O(nlogn)&#xff0c;其中n为原始数据…

07 | Swoole 源码分析之 Channel 通道模块

原文首发链接&#xff1a;Swoole 源码分析之 Channel 通道模块 大家好&#xff0c;我是码农先森。 引言 通道&#xff0c;用于协程间通讯&#xff0c;支持多生产者协程和多消费者协程。底层自动实现了协程的切换和调度。 通道与 PHP 的 Array 类似&#xff0c;仅占用内存&am…

非关系型数据库(缓存数据库)redis的基础认知与安装

目录 一.关系型数据库和非关系型数据库 关系型数据库 非关系型数据库 关系数据库与非关系型数据库的区别 ①非关系数据 关系型数据库 非关系型数据库产生背景 数据存储流向 非关系型数据库 关系数据库 二.redis的简介 1.概念 2.Redis 具有以下几个优点: 3.Redi…

Salesforce团队:科技文档的受众比你想象要多

▲ 搜索“大龙谈智能内容”关注公众号▲ 扫码见我视频号上的视频 视频时长为38分钟&#xff0c;如果你没有时间看&#xff0c;这里是我用AI做的总结&#xff1a; 视频总结 Salesforce的文档团队成员讨论了文档在销售过程中对潜在客户的重要性。 集锦 00:48 &#x1f4a1; S…

Java简单实现一个LRU(最近最少使用淘汰策略)

目录 LRU介绍&#xff1a; 一些淘汰策略&#xff1a; Java简单实现LRU&#xff1a; 测试&#xff1a; ​编辑 实现原理&#xff1a; LRU介绍&#xff1a; LRU 是 "Least Recently Used" 的缩写&#xff0c;意为"最近最少使用"。它是计算机科学中的一种…