[Linux] linux 软硬链接与动静态库
标题:[Linux] linux 软硬链接与动静态库
个人主页@水墨不写bug
(图片来源于网络)
/** _oo0oo_* o8888888o* 88" . "88* (| -_- |)* 0\ = /0* ___/`---'\___* .' \\| |// '.* / \\||| : |||// \* / _||||| -:- |||||- \* | | \\\ - /// | |* | \_| ''\---/'' |_/ |* \ .-\__ '-' ___/-. /* ___'. .' /--.--\ `. .'___* ."" '< `.___\_<|>_/___.' >' "".* | | : `- \`.;`\ _ /`;.`/ - ` : | |* \ \ `_. \_ __\ /__ _/ .-` / /* =====`-.____`.___ \_____/___.-`___.-'=====* `=---='* * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* * 佛祖保佑 永不宕机 永无BUG*/
目录
(一)软硬链接
(1)见一见软硬链接
(2)软硬链接的本质?
(3)软硬链接的应用?
a.软连接
b.硬连接
(二)动静态库
(1)什么是库?
(2)如何制作动静态库?
a,生成静态库
查看静态库中的目录列表
使用静态库
b,生成动态库
使用动态库
(3)库的路径搜索
正文开始:
(一)软硬链接
(1)见一见软硬链接
在具体讲解软硬链接之前,我们抛弃令人费解的概念不谈,先见一见软硬链接。
场景一:我们在一个项目目录中,编译编写的代码,形成mytest可执行程序:

但是我们想要在当前目录而不是在test_link目录中找到mytest,这就需要一个快捷方式,如何创建一个快捷方式?
场景二:Linux目录默认都会有当前目录和上一级目录,可是为什么呢?

在Linux目录下,我们可以通过指令创建软链接:
建立软链接:
ln -s 目标文件的位置和文件名 建立的软连接的名称
建立硬链接:
ln 目标文件的位置和文件名 建立的软连接的名称
对于场景一,可以在test_link的同级目录中创建一个软链接:

这样,对于建立的软链接的访问,就类似于直接对mytest的访问:

对于场景二,每一个目录中的本目录和上一级目录本质就是一个硬连接。
(2)软硬链接的本质?
软链接:
软链接是一个独立的文件,因为软链接形成的链接有独立的inode number。
硬链接:
硬连接不是一个独立的文件,因为硬链接没有独立的inode number。
软链接的内容是目标文件所对应的路径字符串,类似于windows的快捷方式。
硬连接是文件名和inode number的映射关系,添加硬连接就是在指定目录下,添加一个新的文件名与inode number的映射关系。
(3)软硬链接的应用?
a.软连接
i,链接各种库,linux的各种指令,本质上就是一个个的可执行程序文件,这些指令的运行需要库文件的支持,才能正常运行。
ii,创建快捷方式,可以帮我们快速找到深路径的文件。
b.硬连接
1)任何一个目录,刚开始创建的时候,我们会发现硬连接引用计数为2:

在目录中创建目录,会使其引用计数+1,因为新建的目录中会有指向本目录的硬连接。
于是,可以推导出:
目录内有几个目录,等于其引用计数-2
同时,需要注意,linux中不能给目录建立硬连接,防止系统在查找文件的时候形成路径环绕。
(二)动静态库
接下来的分享以笔记形式进行!
/** ::* :;J7, :, ::;7:* ,ivYi, , ;LLLFS:* :iv7Yi :7ri;j5PL* ,:ivYLvr ,ivrrirrY2X,* :;r@Wwz.7r: :ivu@kexianli.* :iL7::,:::iiirii:ii;::::,,irvF7rvvLujL7ur* ri::,:,::i:iiiiiii:i:irrv177JX7rYXqZEkvv17* ;i:, , ::::iirrririi:i:::iiir2XXvii;L8OGJr71i* :,, ,,: ,::ir@mingyi.irii:i:::j1jri7ZBOS7ivv,* ,::, ::rv77iiiriii:iii:i::,rvLq@huhao.Li* ,, ,, ,:ir7ir::,:::i;ir:::i:i::rSGGYri712:* ::: ,v7r:: ::rrv77:, ,, ,:i7rrii:::::, ir7ri7Lri* , 2OBBOi,iiir;r:: ,irriiii::,, ,iv7Luur:* ,, i78MBBi,:,:::,:, :7FSL: ,iriii:::i::,,:rLqXv::* : iuMMP: :,:::,:ii;2GY7OBB0viiii:i:iii:i:::iJqL;::* , ::::i ,,,,, ::LuBBu BBBBBErii:i:i:i:i:i:i:r77ii* , : , ,,:::rruBZ1MBBqi, :,,,:::,::::::iiriri:* , ,,,,::::i: @arqiao. ,:,, ,:::ii;i7:* :, rjujLYLi ,,:::::,:::::::::,, ,:i,:,,,,,::i:iii* :: BBBBBBBBB0, ,,::: , ,:::::: , ,,,, ,,:::::::* i, , ,8BMMBBBBBBi ,,:,, ,,, , , , , , :,::ii::i::* : iZMOMOMBBM2::::::::::,,,, ,,,,,,:,,,::::i:irr:i:::,* i ,,:;u0MBMOG1L:::i:::::: ,,,::, ,,, ::::::i:i:iirii:i:i:* : ,iuUuuXUkFu7i:iii:i:::, :,:,: ::::::::i:i:::::iirr7iiri::* : :rk@Yizero.i:::::, ,:ii:::::::i:::::i::,::::iirrriiiri::,* : 5BMBBBBBBSr:,::rv2kuii:::iii::,:i:,, , ,,:,:i@petermu.,* , :r50EZ8MBBBBGOBBBZP7::::i::,:::::,: :,:,::i;rrririiii::* :jujYY7LS0ujJL7r::,::i::,::::::::::::::iirirrrrrrr:ii:* ,: :@kevensun.:,:,,,::::i:i:::::,,::::::iir;ii;7v77;ii;i,* ,,, ,,:,::::::i:iiiii:i::::,, ::::iiiir@xingjief.r;7:i,* , , ,,,:,,::::::::iiiiiiiiii:,:,:::::::::iiir;ri7vL77rrirri::* :,, , ::::::::i:::i:::i:i::,,,,,:,::i:i:::iir;@Secbone.ii:::*/
(还是讲解一下比较好,所以还是正常的blog形式)
(1)什么是库?
我们平时使用的各种库,但是这些库到底是怎么运行的?
库本质是语言层面的开发者写好并编译形成的.o 文件(可重定向目标文件),以及头文件。对于头文件,本质上是一个手册,因为我们用户不能直接看懂.o文件(二进制的文件),所以这个.o文件到底有什么作用,我们用户不知道如何使用这个库!!于是需要头文件来解释,头文件为用户提供了库文件的使用方法(比如函数声明,宏定义,类声明等)。
.o文件提供了实现,.h文件提供了说明。
用户只需要补上一个main函数文件,在这个文件中调用头文件提供的方法,然后和 库提供的.o 文件进行链接,最终就可以形成我们自己的可执行程序。
总而言之,所谓库文件,本质就是把多个.o文件打包。目的是提高开发效率。
Linux下的动静态库:
静态库(.a):程序在编译链接的时候把库的代码拷贝到可执行文件中,程序运行的时候将不再需要静态库。
动态库(.so) :程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。(动态库删掉后程序无法正常运行) 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为 动态链接(dynamic linking) 。
库的命名规则:
如:libc.so -> c库,去掉前缀lib,去掉后缀.so,.a
动态库的优势:(动态库使用较多,为什么?)
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。
操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间 ,所以在实际场景中,项目大多使用动态库。(链接库的内存层面具体细节在以后会分享)
(2)如何制作动静态库?
我们实现了add.c add.h sub.c sub.h 并自己添加了main函数,如何生成自己的静态库,并在编译后链接到main文件中?
ddsm@ddsm-alicloud:~/_10_29_blog$ ls
add.c add.h main.c sub.c sub.h
ddsm@ddsm-alicloud:~/_10_29_blog$ gcc -c add.c -o add.o
ddsm@ddsm-alicloud:~/_10_29_blog$ gcc -c sub.c -o sub.o
a,生成静态库
ddsm@ddsm-alicloud:~/_10_29_blog$ ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表
ddsm@ddsm-alicloud:~/_10_29_blog$ ar -tv libmymath.a
rw-r--r-- 0/0 1240 Oct 15 16:53 2024 add.o
rw-r--r-- 0/0 1240 Oct 15 16:53 2024 sub.o
t:列出静态库中的文件
v:verbose 详细信息
使用静态库
ddsm@ddsm-alicloud:~/_10_29_blog$ gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
b,生成动态库
ddsm@ddsm-alicloud:~/_10_29_blog$ gcc -fPIC -c sub.c add.c ddsm@ddsm-alicloud:~/_10_29_blog$ gcc -shared -o libmymath.so*.o ddsm@ddsm-alicloud:~/_10_29_blog$ ls add.c add.h add.o libmymath.so main.c sub.c sub.h sub.oshared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
使用动态库
L:链接库所在的路径.
l:链接动态库,只要库名即可(去掉lib以及版本号)
运行动态库
1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib
2、更改 LD_LIBRARY_PATHddsm@ddsm-alicloud:~/_10_29_blog$ export LD_LIBRARY_PATH=. ddsm@ddsm-alicloud:~/_10_29_blog$ gcc main.c -lmymath ddsm@ddsm-alicloud:~/_10_29_blog$ ./a.out add(10, 20)=30 sub(100, 20)=803、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新
[root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf /root/tools/linux [root@localhost linux]# ldconfig
(3)库的路径搜索
无论是动态库还是静态库,在编译的时候都需要告诉编译器库的位置信息,一旦编译成功,静态链接的程序可以不受库的限制,可以随意使用。
首先需要告诉编译器动态库的位置,才能编译成功。但是这只是第一步。虽然编译成功,但是OS无法找到库,依然是无法正常运行程序的。
如何让操作系统会在如下的目录中查找库:
1)由环境变量指定的目录 (LIBRARY_PATH)
2)由系统指定的目录
/usr/lib
/usr/local/lib
可以通过多种方式让操作系统找到库,根据前文的讲解,你或许已经知道了如何操作,这里给出5种方法:


完~
未经作者同意禁止转载
相关文章:
[Linux] linux 软硬链接与动静态库
标题:[Linux] linux 软硬链接与动静态库 个人主页水墨不写bug (图片来源于网络) /** _oo0oo_* o8888888o* 88" . "88* (| -_- |)* …...
GitHub Actions的 CI/CD
GitHub Actions 是一个强大的 CI/CD 工具,适用于自动化各种开发任务。GitHub Actions 的原理是基于事件驱动的自动化流水线工具,通过定义触发条件和执行步骤,可以让项目在特定条件下自动运行一系列操作,比如构建、测试、部署等。 …...
doris 表结构批量导出
导出 test 数据库中的 table1 表:mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1 导出 test 数据库中的 table1 表结构:mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables tab…...
linux查看文件命令
查看文件命令 显示命令 cat 语法:cat 【选项】 文件 选项 命令含义n显示行号包括空行b显示行号不包括空行s压缩空行为一行A显示隐藏字符 cat -n 文件:显示行号包括空行 cat -b 文件 cat -s 文件 cat -A 文件 more和less是 分页查看 tac和rev都…...
【2023工业图像异常检测文献】DiAD: 基于扩散模型的多类异常检测方法
DiAD: A Diffusion-based Framework for Multi-class Anomaly Detection 1、Background 当前主流的三种异常检测方法: 基于合成的方法:在正常图像上合成异常,通过训练模型识别这些合成的异常来提高检测和定位能力。基于嵌入的方法ÿ…...
三相继电保护机 继电器保护校验仪 微机继电保护测试仪
性能特点 电压电流输出灵活组合 输出达4相电压3相电流,可各种组合实现常规4相电压3相电流型输出模式,既可兼容传统的各种试验方式,也可方便地进行三相变压器差动试验和厂用电快切和备自投试验。 操作方式装置直接外接笔记本电脑或台式机进行…...
MyEclipse中讲解Git使用——结合GitLab
1、什么是Git Git是分布式版本控制系统 Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 2、在myeclipse安装Git插件 下载该文件,将egit.zip解压放入 myeclipse安装路径>dropins>下重新启动myeclipse EGit -…...
pdf转为txt文本格式并使用base64加密输出数据
第一步,pom.xml中引入jar包 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version></dependency> 第二步 package org.example.test.example.changefile;…...
SpringBoot篇(运维实用篇 - 临时属性)
目录 一、临时属性设置 1. 简介 2. 属性加载优先级 那是否还有其他的配置方式呢? 3. 知识小结 二、开发环境中使用临时属性 1. 如何操作 2. 知识小结 3. 思考 三、配置文件分类 1. 简介 2. 4个级别 3. 为什么设计多种配置文件? 一个典型的应…...
MySQL定时异机备份
场景:将A机器MySQL数据库部分表每日定时备份到B机器上 (只适用于Linux) 实现方式算是比简单了,就是用mysqldump生成文件,使用scp命令传输到另一台机器上。 1. 编写备份shell脚本 在A机器新建脚本 (当然没有vim的话vi…...
MMA: Multi-Modal Adapter for Vision-Language Models
两个观察 图1所示。各种基于transformer的CLIP模型中不同层的数据集级识别精度。这个实验是为了确定样本属于哪个数据集。我们用不同的种子运行了三次,并报告了每层识别精度的平均值和标准差。 X E m b e d XEmbed XEmbed是指变压器块之前的文本或图像嵌入层&#x…...
uniapp通过id获取div的宽度,高度,位置等(应该是 任意平台都通用 )
uniapp通过id获取div的宽度,高度,位置等(应该是 任意平台都通用 ) <template><view class"" id"domId"></view> </template>// 如果获取的dome高度等不对,还需要加上延迟…...
Python Transformer 模型的基本原理:BERT 和 GPT 以及它们在情感分析中的应用
Transformer 模型的基本原理:BERT 和 GPT 以及它们在情感分析中的应用 近年来,Transformer 模型在自然语言处理(NLP)领域取得了巨大成功,为任务如翻译、生成文本、问答和情感分析带来了显著的性能提升。本文将介绍 Tr…...
【云原生】Kubernets1.29部署StorageClass-NFS作为存储类,动态创建pvc(已存在NFS服务端)
文章目录 在写redis集群搭建的时候,有提到过使用nfs做storageclass,那时候kubernetes是1.20版本,https://dongweizhen.blog.csdn.net/article/details/130651727 现在使用的是kubernetes 1.29版本,根据之前的修改方式并未生效,反而提示:Error: invalid argument "Re…...
使用 Pandas 进行时间序列分析的 10个关键点
使用Pandas进行时间序列分析的10个关键点(由于篇幅限制,这里调整为10个,但实际操作中可能涉及更多细节)如下: 1. 创建时间序列数据 时间序列数据是指在多个时间点上形成的数值序列。在Pandas中,可以使用t…...
使用 Mermaid 语言描述 AGI 系统架构图
使用Mermaid语言描述AGI系统架构图 一、整体架构概述 以下是一个简化的AGI(Artificial General Intelligence,通用人工智能)系统架构的Mermaid描述。该系统主要包括数据收集与预处理、模型训练、推理与决策以及交互接口等模块,各…...
绘制线性可分支持向量机决策边界图 代码解析
### 绘制线性可分支持向量机决策边界图 def plot_classifer(model, X, y):# 超参数边界x_min -7x_max 12y_min -12y_max -1step 0.05# meshgridxx, yy np.meshgrid(np.arange(x_min, x_max, step),np.arange(y_min, y_max, step))# 模型预测z model.predict(np.c_[xx.ra…...
No.23 笔记 | WEB安全 - 任意文件漏洞 part 5
本文全面且深入地探讨了文件上传漏洞相关知识。从基础概念出发,清晰地阐述了文件上传漏洞的定义及其产生的本质原因,同时列出了该漏洞成立的必要条件。详细说明了文件上传漏洞可能对服务器控制权、网站安全以及业务运营带来的严重危害。 文中还深入解析了…...
EasyPlayer.js网页播放器,支持FLV、HLS、WebSocket、WebRTC、H.264/H.265、MP4、ts各种音视频流播放
EasyPlayer.js功能: 1、支持解码H.264视频(Baseline, Main, High Profile全支持,支持解码B帧视频) 2、支持解码H.265视频(flv id 12) 3、支持解码AAC音频(LC,HE,HEv2 Profile全支持) 4、支持解码MP3音频以及Speex音频格式 5、可…...
WPF数据绑定的五大模式
WPF(Windows Presentation Foundation)是微软推出的一种用于构建Windows用户界面的UI框架。它支持数据绑定,允许开发者将UI元素与数据源绑定,从而实现数据和界面的自动同步。WPF数据绑定有几种不同的模式, 以下是五种…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

