Linux软硬链接与动静态库

news2025/3/12 17:26:55

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
在这里插入图片描述

文章目录

  • 一、创建软硬链接
  • 二、软硬链接
    • ①软链接
    • ②硬链接
    • ③硬链接的用处
    • ④软硬链接的区别
  • 三、库的作用
    • ①库与为什么用库
    • ②动静态库的加载过程
  • 四、动静态库
    • ①静态库 .a
    • ②使用静态库
      • 1.将这个库拷贝到系统的库路径下
      • 2.直接使用该库
    • ③动态库 .so
    • ④使用动态库
      • 1.直接使用
      • 2.系统的环境变量 LD_LIBRARY_PATH
      • 3.修改配置文件
      • 4.在lib64建立动态库的软链接

一、创建软硬链接

ln 文件名  文件名//ln testLink1.txt hard.link//硬链接
ln -s 文件名 文件名//软连接

ln即为link,所以也可以用link/link -s
在这里插入图片描述
删除一个文件,除了可以用rm之外,unlink也是可以删除的

二、软硬链接

①软链接

在另外的路径下创建的可执行程序,我想去执行一下,那么就要用绝对路径或者相对路径或者说配置环境变量,但是如果这个路径特别特别深,那么每次都要去写绝对/相对路径的时候就比较麻烦这时候,软链接就发挥作用了,在当前路径下进行软链接==ln -s xxx路径 myexe可执行文件名
然后直接运行这个软链接就可以跑了,所以,软链接就相当于Windows下的快捷方式一样,就可以理解为:软链接文件的内容,是指向的要找的那个文件对应的路径

②硬链接

创建硬链接,不是真正的创建新文件,因为硬链接没有独立的inode编号,但是他有inode编号,用的是其他文件的内容和属性
创建硬链接就是在指定目录下,建立了文件名和指定inode编号的映射关系(作用可以看看上一篇文件系统和inode),也就是说硬链接仅仅是起了一个别名

在这里插入图片描述
可以发现testLink1.txt和hard.link的inode编号是一样的,所以只是建立了文件名和inode的映射关系
在这里插入图片描述
我们此时把testLink1.txt删掉,我们看到,hard.link仍然还在(inode还在,说明文件还在),那么此时说明只是把目录data blocks中testLink1.txt和inode的映射关系删掉了。(文件系统与inode中讲到)我们可以看到,有一个数字从2变成了1,这个数字就是硬链接数,硬链接数在inode中就是一个计数器,来记录有多少个文件名和这个inode有映射关系(引用计数),当我们删掉一个文件的时候,只是把硬链接数-1,(也就是删掉了一个映射),当硬链接数变为0的时候,这个文件才真正被删除

③硬链接的用处

创建一个普通文件,它的硬链接数是1,但是当我们创建了一个空目录,它的硬链接数是2
在这里插入图片描述

这是因为,首先,建立了一个目录文件,这个目录文件本身就和inode编号有一组映射关系,其次,一个空目录里面,默认就有 ... 这两个文件,而这个.就代表的是当前目录下,也就是dir的硬链接,通过inode编号我们可以看出来
在这里插入图片描述
而当我们再在dir下创建一个目录d1,那么d1中还有一个..指向了dir目录文件,所以这时,dir目录文件的硬链接数是3
在这里插入图片描述

④软硬链接的区别

区别就是软链接有自己独立的inode,他像是一个快捷方式,软链接data block存储的是被链接文件的地址。而硬链接没有自己独立的inode,它只是当前文件名和inode的一种映射,就像是给文件取别名,同一个inode编号的不同映射

三、库的作用

①库与为什么用库

1.什么是库?库是一段编译好的二进制代码
2.为什么要用库?
①别人提供,不想让我们看到细节,只给我们使用方法(头文件)和编译好的库,再给一个使用手册或者官方文档,程序员自己搜,工作之间完全解耦
②某些不会进行大的改动的代码,会打包成库,因为是编译好的,所以节省时间,用的时候link一下就可以了

②动静态库的加载过程

静态库在链接的时候会将二进制代码拷贝一份过来,复制到目标程序里。静态库的好处很明显,就是目标程序没有外部依赖,直接就可以运行,但是缺点就是会增大目标文件的体积,而且大的还不少

动态库与静态库相反,并不会拷贝到目标文件中,而目标文件中只会存储指向动态库的引用,等到程序运行时,动态库才会分批载入内存。而动态库是在进程地址空间的共享区的,它加载一次可以被多个进程使用,所以也被称为共享库,根据以上特性,所以比静态链接的目标文件小很多,动态库的优点就在于此,而且因为运行时才载入,所以我们不用重新编译就可以替换动态库,但是动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行。

四、动静态库

如果把头文件(看函数声明)目标文件给别人用,那么也能用,但是目标文件此时就有一堆,用起来难受,而且如果弄丢一个就更难受。
在这里插入图片描述

①静态库 .a

多个目标文件.o进行归档archive(放在一起),就形成了静态库
库的前缀必须是lib,静态库的后缀必须是.a,动态库的后缀必须是.so

ar -rc libhello.a mymath.o myprint.o
//-r是replace替换,-c是create创建

archive -rc的makefile自动化

libhello.a:mymath.o myprint.o
	ar -rc libhello.a mymath.o myprint.o

在这里插入图片描述
本质上就是打包

②使用静态库

1.将这个库拷贝到系统的库路径下

文件的系统路径: /usr/include
库的系统路径 /usr/lib64或者/lib64,两个都可以

在这里插入图片描述
在这里插入图片描述
但是当我将头文件和静态库都拷贝到系统目录之后,为了编译main.c还是报错呢?因为我们自己写的库是第三方库,编译的时候就需要告诉编译器我们用的什么库库的名字需要去掉前缀和后缀

gcc main.c -l hello //即可

在这里插入图片描述
这样即可使用,把库拷贝到系统目录下,这个过程就叫做库的安装,所谓的安装,也就是拷贝,无论是在Linux还是在Windows,但是呢,自己写的第三方库并没有经过可靠性验证,所以并不建议把自己写的库安装在系统目录下,所以赶紧删掉,这就是库的卸载

2.直接使用该库

在这里插入图片描述
没有安装库,当然找不到,因为我们调用库的时候,首先会在当前目录下找,找不要就会在特定目录下搜索,也就是/usr/lib64或者/lib64。

//找头文件和库
gcc main.c -I ./hello/include/-L ./hello/lib/ -l hello
//第三方库,告诉库名

//-I是include
//-L是library     
//-l表示去链接某个库,因为./hello/lib/下的库
//可能不止一个,所以要指定

③动态库 .so

静态库有它自己的地址空间,因为每一个进程都需要拷贝一份静态库,必须要拷贝到可执行的特定位置,才能够被我访问到,这叫做与地址有关,静态库是一种绝对编址的方案。

动态库采用的是相对编址的方案,动态库是在进程地址空间的共享区的,而只需要拿到动态库在物理内存当中的起始位置和偏移量,就可以找到,一个动态库可以被多个进程共享

gcc -fPIC -c mymath.c -o mymath.o
//-fPIC这个选项就是形成一个与位置无关的二进制目标文件
gcc -shared myprint.o mymath.o -o lobhello.so
//-shared 区分是生成可执行程序还是动态库,因为linux不以文件名来区分文件

在这里插入图片描述
然后将生成的这个动态库也放到hello/lib/

④使用动态库

1.直接使用

在这里插入图片描述

gcc main.c -I ./output/include/ -L ./output/lib/ -l hello

当我们既有动态库又有静态库libhello.a libhello.so
那么默认会进行动态链接(用dll来查看可以看出),只有静态库的话就链接静态库,如果两个都有,编译的时候添加 -static选项来进行静态链接

在这里插入图片描述

2.系统的环境变量 LD_LIBRARY_PATH

这个环境变量就是库加载时候的搜索路径

echo $LD_LIBRARY_PATH进行环境变量的查看
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:路径  进行环境变量的修改

因为这个环境变量是内存级的环境变量,下次登录的时候环境变量会从配置文件中重新获取,所以,我们这样配置的环境变量下次登录就没了

3.修改配置文件

在这里插入图片描述
这个路径保存的是允许可以自定义配置搜索库路径的永久解决方案,具体做法就是touch一个xxx.conf然后把搜索路径粘上去,保存之后idconfid就生效了。建议不要随便改配置文件

4.在lib64建立动态库的软链接

ln -s 库的路径 /lib64/软链接的文件名

建立一个软链接,然后系统目录下就可以找到,因为是第三方库,所以-l高速编译器库名就可以找到。
在这里插入图片描述

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

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

相关文章

大数据分析如何进行日志采集

最近经常和技术大牛在交流,每次的碰撞都会让我产生更多的想法。例如这次谈到的,某企业信息化用了二三十种的公有云服务、有二十多种业务系统的数据库使用了同一个物理库、云产品的稳定性是值得肯定的。今天我们就来谈一谈日志在数据库中的作用以及如何采…

[附源码]Python计算机毕业设计SSM基于java语言的在线电子书阅读系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

基于jsp+mysql+ssm小熊猫水果管理系统-计算机毕业设计

项目介绍 小熊猫水果管理系统是水果商业贸易中的一条非常重要的道路,可以把其从传统的实体模式中解放中来,网上购物可以为消费者提供巨大的便利。通过小熊猫水果管理系统这个平台,可以使用户足不出户就可以了解现今的流行趋势和丰富的水果信…

在中国程序员能不能干一辈子?

在中国程序员当然能干一辈子,因为35岁的程序员已经自动死亡,全网销声匿迹,查无此人了,这辈子已经玩完了(雾 开个玩笑,就是看够了那些焦虑文学,我只想说: 程序员到35岁、45岁、55岁&…

【LeetCode】1697. 检查边长度限制的路径是否存在

题目描述 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边。请注意,两个点之间可能有 超过一条边 。 给你一个查询数组queries ,其中 queries[j] [pj, qj, limi…

外部注意力机制与内部注意力机制

自注意力是注意力机制的一种特殊情况,其核心思想为通过计算特征内部元素之间的联系来获得大范围内的依赖关系。而在外部注意力中,key被拿到了网络外部,因此可以习得数据集的全局状况。 自注意力机制中,输入特征F被投射到query矩阵…

Qt扫盲-QAbstractSlider理论总结

QAbstractSlider理论总结1. 概述2. 常用属性3. 信号1. 概述 QAbstractSlider 其实就是 QScrollBar, QSlider and QDial 的父类,也就是抽象类定义了Slider这种控件的一些公共属性,其实就是一个抽象滚动条的主要属性。 就比如一个具体的滑动条&#xff0c…

服务器load高问题定位和优化

服务器开发系列 文章目录服务器开发系列前言一、原因分析与定位?总结前言 什么是Load?什么是Load Average?   Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a measure of the amount of work that a comput…

isaac gym(二)仿真setup(代码齐全)

目录 .1 Simulation Setup .2 Creating a Simulation 2.1 Simulation Parameters 2.1.1 Up Axis 2.2 Creating a Ground Plane .3 Loading Assets .4 Environments and Actors 4.1 env 4.2 actors 4.3 Test .5 Running the Simulation .6 Adding a Viewer ​编辑 .7 Th…

03_1排序算法:冒泡排序、选择排序、插入排序

开始系统学习算法啦!为后面力扣和蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括概念,算法运行过程,以及代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私信博…

专访 | 刘乔升:开源是人类智力劳动最好的组织形式

OpenMLDB: 可以请你先自我介绍一下吗? 刘乔升: 我叫刘乔升,来自复旦大学,就读于软件工程专业,是 2022 开源之夏 OpenMLDB Go SDK 项目的贡献者。在参加本届开源之夏活动前,我就有参加过一些开源…

自定义maven骨架

目录 一、自定义maven骨架 1、先创建一个新的工程、添加你需要的结构目录及pom所需要的依赖文件,以这个工程为模板,创建框架 2、添加在pom文件中添加依赖,com.test文件中这个坐标与maven仓库相对应 3、点击Edit....会有一个弹窗 4、点击加…

如何在SpringBoot中设置HTTP缓存,你知道么?

在工作之余阅读缓存相关的书籍时,看到了http缓存相关的知识,HTTP 缓存机制是一个 web 性能优化的重要手段,无论是做前端还是做web后台,都可能会用得到它,应该是知识体系库中的一个基础环节,以前这一块学的不…

TAPD新增需求自动写入腾讯文档

【实现效果:】TAPD新增需求/缺陷,可以自动写入腾讯文档智能表,方便通过腾讯文档灵活管理自己的项目排期,并且通过不同的视图效果,实现简单的需求统计/分组迭代,通过数据关联及时跟进延期项目。 【准备工作…

引用类型 - JavaScript 数组对象、遍历、复制、冒泡排序、选择排序、数组方法、数组去重

写在前面 哎呀呀,每次都是要沉淀好久好久才能更一篇文章…基本上半个月都很难出一篇,但还是想把这个系列做起来,主要是为了记录自己学习和开发的过程,以便在面试的时候讲项目,能说得头头是道(◍•ᴗ•◍) 马上就要开…

Clickhouse

目录 Clickhouse简介 整体架构 数据接入层 数据存储层 数据服务层 数据应用层 Clickhouse简介 目前企业用户行为日志每天百亿量级,虽然经过数仓的分层以及数据汇总层通用维度指标的预计算,有些个性化的分析场景还是需要直接编写程序或sql查询&…

python人工智能学习需要学什么?

前言 如果要从科技领域找出最大的变化和革新,那么我们很难不说到“人工智能”这个关键词。人工智能催生了大量新技术、新企业和新业态,为个人、企业、国家乃至全球提供了新的经济增长点,上到谷歌、苹果、百度等巨头,下到各类创业…

发布-订阅模式解读

发布-订阅模式 先简单说一下发布订阅模式各个组件的定义: 发布者 Publisher : 状态改变时 , 向 消息中心 发送事件 ; 订阅者 Subscriber : 到 消息中心 订阅自己关心的事件 ; 消息中心 : 负责维护一个 消息队列 , 根据 消息类型 将 消息 转发给 对应的 订阅者 ; 下面按照该…

差错控制方法----循环冗余码计算

差错控制方法----循环冗余码计算 循环冗余码,又称为多项式码。CRC的工作方法是在发送端产生一个冗余码,附加在信息位后面一起发送到接收端,接收端收到的信息按发送端形成循环冗余码同样的算法进行校验,如果发现错误,则…

(附源码)php校园电子图像信息采集系统 毕业设计 010930

目 录 摘要 1 1 绪论 1 1.1 研究背景 1 1.2研究内容 1 1.3论文结构与章节安排 1 2 校园电子图像信息采集系统 系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1 数据增加流程 3 2.2.2 数据修改流程 4 2.3.3数据删除流程 4 2.3 系统功能分析 4 2.3.1 功能性分析 4 2.3.2 …