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

目录

  • 一. 软硬链接
    • 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 生成的.

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态规划:背包问题合集

01背包 定义dp[i][j]&#xff1a;在前i件物品中选出若干件&#xff0c;放入容量为j的背包&#xff0c;能获得的最大价值。 考虑第i件物品拿还是不拿。讨论c[i]与背包容量的关系&#xff1a; &#xff08;1&#xff09;j < c[i] 时&#xff0c;背包容量为j&#xff0c;而第…

C++进阶编程 --- 3(上).string容器、vector容器、deque容器、stack容器

文章目录 第三章(上)&#xff1a;3.STL 常用容器3.1 string容器3.1.1 string基本概念3.1.2 string构造函数3.1.3 string赋值操作3.1.4 string字符串拼接3.1.5 string查找和替换3.1.6 string字符串比较3.1.7 string字符存取3.1.8 string插入与删除3.1.9 string子串 3.2 vector容…

14届蓝桥杯 C/C++ B组 T5 接龙排序 (最长上升子序列DP+优化)

不难发现这是一个LIS问题&#xff0c;但是如果直接套用LIS的模版&#xff0c;在数据范围到达 1 e 5 1e5 1e5 的情况下&#xff0c;就只能够得到一半的分数&#xff0c;所以我们需要对其进行优化。 首先给出暴力的代码&#xff1a; #include<iostream> using namespace…

Linux虚拟网络设备深度解析:使用场景、分类与开发者指南

Linux虚拟网络设备支撑着各种复杂的网络需求和配置&#xff0c;从基础的网络桥接到高级的网络隔离和加密&#x1f510;。以下是对主要Linux虚拟网络设备的介绍、它们的作用以及适用场景的概览&#xff0c;同时提出了一种合理的分类&#xff0c;并指出应用开发人员应该着重掌握的…

vue2/vue3手写专题——实现双向绑定/响应式拦截/虚拟DOM/依赖收集

目录 vue双向绑定 请手动实现一个简单的双向绑定功能&#xff0c;要求实现以下功能&#xff1a; 1.使用原生javaScript 2.使用vue非v-model方式实现 思考&#xff1a;vue为什么要做双向绑定&#xff1f; 虚拟DOM/Render函数 将给定html片段写出Virtual Dom结构、并尝试挂载到页…

【面试】运算器-⑪搜索旋转排序数组

先存一下后面要用的字符⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ 33. 搜索旋转排序数组 感谢力扣&#xff01; 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了…

《UE5_C++多人TPS完整教程》学习笔记31 ——《P32 角色移动(Character Movement)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P32 角色移动&#xff08;Character Movement&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

S32K324 数据初始化Rom到Ram Copy的方式

文章目录 前言基础知识ld文件中的段定义ld文件中的符号定义 ld定义copy地址范围启动文件中的定义Copy的使用总结 前言 之前一直不理解在ld文件中加__xxx_ram_start,__xxx_rom_start,__xxx_rom_end这些的作用&#xff0c;也不清楚原理。前几天遇到一个内存copy的问题&#xff0…

云计算(五)—— OpenStack基础环境配置与API使用

OpenStack基础环境配置与API使用 项目实训一 【实训题目】 使用cURL命令获取实例列表 【实训目的】 理解OpenStack的身份认证和API请求流程。 【实训准备】 &#xff08;1&#xff09;复习OpenStack的认证与API请求流程的相关内容。 &#xff08;2&#xff09;熟悉cURL…

软件设计师——数据库

数据库 三级模式两级映像关系模型基本术语关系模型中的关系完整性约束 三级模式两级映像 概念模式&#xff08;也称模式&#xff09;对应基本表 外模式&#xff08;也称用户模式或子模式&#xff09;对应视图 内模式&#xff08;也称存储模式&#xff09;对应存储文件 两级映像…

SL1581耐压30V芯片 24V转5V/2.4A

SL1581是一款专为24V转5V/2.4A应用设计的耐压30V芯片。这款芯片采用了先进的电源管理技术和高效能的转换电路&#xff0c;为电子设备提供了稳定、可靠的电源输出。 首先&#xff0c;SL1581芯片具有出色的耐压性能&#xff0c;能够在高达30V的电压下稳定工作。这使其非常适合在需…

RFID涉密载体柜 RFID智能文件柜系统

涉密载体管控RFID智能柜&#xff08;载体柜DW-G101R&#xff09;通过对涉密物资、设备进行RFID唯一标识并放置于RFID设备涉密物资柜柜体&#xff0c;通过定位每台设备每件涉密物资的位置&#xff0c;实现涉密物资审批、自助借还、防盗等出入库全流程自动化管理。主要管理对象移…

Vulnhub:MHZ_CXF: C1F

目录 信息收集 arp-scan nmap nikto WEB web信息收集 dirmap gobuster ssh登录 提权 获得初始立足点 系统信息收集 横向渗透 提权 信息收集 arp-scan ┌──(root㉿ru)-[~/桌面] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:…

产品经理和项目经理的区别

1. 前言 本文深入探讨了产品经理与项目经理在职责、关注点以及所需技能方面的显著区别。产品经理主要负责产品的规划、设计和市场定位,强调对用户需求的深刻理解和产品创新的推动;而项目经理则侧重于项目的执行、进度控制和资源管理,确保项目按时、按质、按预算完成。两者在…

C++11可变模板参数:海纳百川的Args

目录 一、可变模板参数的概念及功能 1.1Args的概念与使用 1.2获取args中的参数 二、emplace可变模板参数的实际应用 三、逗号表达式展开参数包 一、可变模板参数的概念及功能 1.1Args的概念与使用 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板…

python中的split()用法

在Python中&#xff0c;split() 是一个字符串方法&#xff0c;用于将字符串按照指定的分隔符分割成一个列表。如果没有提供分隔符&#xff0c;那么它会默认按照任何空白字符&#xff08;如空格、换行符、制表符等&#xff09;进行分割。 这里是 split() 方法的一些基本用法&am…

德兰梅尔:耐高温热销的膜元件亮相2024上海国际生物发酵展

德兰梅尔&#xff1a;耐高温热销的膜元件盛装亮相2024上海国际生物发酵展&#xff0c;8月7-9号上海新国际博览中心与您不见不散&#xff01; 据了解&#xff0c;从成立至今&#xff0c;德兰梅尔一直专注膜技术、膜产品的开发生产。在中国市场上&#xff0c;德兰梅尔刚步入中国…

代码随想录算法训练营33期 第三十一天(补29) | 491. 非递减子序列、46. 全排列、47. 全排列 II

491. 非递减子序列 class Solution { public:vector<int> path;vector<vector<int>> result;void BackTracking(vector<int>& nums, int index){if(path.size()>2){result.push_back(path);}unordered_set<int> usedSet;for (int iindex…

nandgame中的asm编程 Escape Labyrinth(逃离迷宫)

先翻译题目&#xff1a; 逃离迷宫计算机被困在火星上的迷宫中。编写一个程序&#xff0c;让它逃离迷宫。计算机配备了连接的轮子和前方障碍物探测器。与轮子和探测器的输入/输出是内存映射在地址7FFF上&#xff1a;对外设的输出信号&#xff1a; 位 设置为1代表&#xff1a; 2…

高精度原边控制离线式PWM功率开关芯片D3820的特征和详细的工作原理介绍

D3820是一款高精度原边控制离线式PWM功率开关。本文主要介绍D3820的特征和详细的工作原理&#xff0c;对反激式隔离AC-DC开关电源提供较为详细的测试过程。 特 点 1、全电压范围CC/CV精度保持在5%以内 2、用原边控制&#xff0c;无需TL431和光耦 3、欠压锁定&#xff08…