[Linux] linux 软硬链接与动静态库

news2024/11/27 12:43:11

标题:[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.o

        shared: 表示生成共享库格式
        fPIC:产生位置无关码(position independent code)
        库名规则:libxxx.so


使用动态库

        L:链接库所在的路径.
        l:链接动态库,只要库名即可(去掉lib以及版本号)


运行动态库

        1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib
        2、更改 LD_LIBRARY_PATH

ddsm@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)=80

        3、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种方法:

 


完~

未经作者同意禁止转载 

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

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

相关文章

VSCode 设置环境变量(WSL 2)

环境&#xff1a;openEuler、Windows 11、WSL 2、python 3.12.3 背景&#xff1a;使用vscode连接Windows 的Linux子系统&#xff0c;开发python项目&#xff0c;获取环境变量失败 时间&#xff1a;20241029 说明&#xff1a;使用os.environ获取不到变量&#xff0c;设置/etc…

控制台安全内部:创新如何塑造未来的硬件保护

在 Help Net Security 的采访中&#xff0c;安全研究人员 Specter 和 ChendoChap 讨论了游戏机独特的安全模型&#xff0c;并强调了它与其他消费设备的不同之处。 他们还分享了对游戏机安全性的进步将如何影响未来消费者和企业硬件设计的看法。 斯佩克特 (Specter) 是本周在阿…

13.音乐管理系统(基于SpringBoot + Vue)

目录 1.系统的受众说明 ​​​​​​​ 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图&#xff08;图2.2.1-1&#xff09; 2.2.2 系统功能表&#xff08;表2.2.2…

TiDB体验一在单机上模拟部署TiDB生产环境集群

TiDB整体架构 TiDB集群主要包括三个核心组件&#xff1a;TiDB Server&#xff0c;PD Server和TiKV Server。 TiDB Server&#xff1a;SQL 层&#xff0c;对外暴露 MySQL 协议的连接 endpoint&#xff0c;负责接受客户端的连接&#xff0c;执行 SQL 解析和优化&#xff0c;最终生…

Conditional DETR论文笔记

原文链接 [2108.06152] Conditional DETR for Fast Training Convergencehttps://arxiv.org/abs/2108.06152 原文笔记 What 《Conditional DETR for Fast Training Convergence》 这个工作也是针对于DETR Query的工作 用于解决DETR训练收敛慢&#xff08;Object query需要…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

C语言中的位操作

第一章 变量某位赋值与连续赋值 寄存器 | 值 //例如&#xff1a;a 1000 0011b a | (1<<2) //a 1000 0111 b 单独赋值 a | (3<<2*2) // 1011 0011b 连续赋值 第二章 变量某位清零与连续清零 寄存器 & ~&#xff08;&#xff09; 值 //例子&#xff1a;a …

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶覆盖&#xff1a; iOS及iPa…

详细分析Pytorch中的transpose基本知识(附Demo)| 对比 permute

目录 前言1. 基本知识2. Demo 前言 原先的permute推荐阅读&#xff1a;详细分析Pytorch中的permute基本知识&#xff08;附Demo&#xff09; 1. 基本知识 transpose 是 PyTorch 中用于交换张量维度的函数&#xff0c;特别是用于二维张量&#xff08;矩阵&#xff09;的转置操…

#PCIE#基础知识分解之 CC/SRNS/SRIS 时钟架构

参考资料为PCIe Base Spec和CEM Spec。 1.1 时钟架构分类 PCIe参考时钟的三种架构&#xff1a; Common Refclk (Shared Refclk) ArchitectureData Clocked Rx ArchitectureSeparate Refclk Architecture 下面&#xff0c;我们来简单地聊一聊前面说到的三种参考时钟架构&…

图书管理系统汇报

【1A536】图书管理系统汇报 项目介绍1.用户登录注册功能1. 1用户角色管理2.图书管理功能2.1 添加图书2.2 编辑图书2.3 删除图书 3.图书搜索和筛选3.1 图书搜索3.2 图书筛选 4.图书借阅、图书归还4.1 图书借阅4.2 图书归还 5.用户信息管理5.1上传头像5.2修改头像5.3 修改密码 项…

js 获取当前时间与前一个月时间

// 获取当前时间的毫秒数 var currentTimeMillis new Date().getTime();// 获取前一个月的Date对象 var dateLastMonth new Date(); dateLastMonth.setMonth(dateLastMonth.getMonth() - 1);// 获取前一个月的毫秒数 var timeMillisLastMonth dateLastMonth.getTime();conso…

Flutter InkWell组件去掉灰色遮罩

当InkerWell组件内部获取到焦点时&#xff0c;会展示一层灰色遮罩 将focusColor属性设置为透明即可 Flutter InkWell焦点效果源码分析 问题描述 当 InkWell 组件获得焦点时&#xff0c;会显示一层灰色遮罩效果。需要找出这个效果是由哪些组件控制的&#xff0c;以及具体的…

【SpringMVC】传递json,获取url参数,上传文件

【传递json数据】 【json概念】 一种轻量级数据交互格式&#xff0c;有自己的格式和语法&#xff0c;使用文本表示一个对象或数组的信息&#xff0c;其本质上是字符串&#xff0c;负责在不同的语言中数据传递与交换 json数据以字符串的形式体现 【json字符串与Java对象互转…

逆向 解密接口信息附Demo(二)

目录 前言1. 加密2. 解密 前言 原先写过另外一篇&#xff0c;推荐阅读&#xff1a;逆向 解密接口信息&#xff08;附Demo&#xff09; 下文以 https://login1.scrape.center/ 进行讲解&#xff0c; 1. 加密 登录过程中可以使用断点进行一步一步排查 或者在js文件中搜索enco…

【周末推荐】Windows无缝连接iPhone

关注“ONE生产力”&#xff0c;获取更多精彩推荐&#xff01; 又到了周末推荐时间了&#xff0c;今天我们介绍一个Windows内置的功能&#xff0c;能够帮助大家将自己的电脑和iPhone连接在一起。 很多用Windows的小伙伴羡慕macOS可以和iPhone无缝连接&#xff0c;轻松阅读和回…

015:地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework安装教程

摘要&#xff1a;本文详细介绍地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework的安装流程。 一、软件介绍 ArcGIS Engine 10.2是由Esri公司开发的一款强大的GIS&#xff08;地理信息系统&#xff09;开发平台。该软件基于ArcGIS 10.2 fo…

基于 Java 的 Spring Boot 和 Vue 的宠物领养系统设计与实现

需要代码 vx&#xff1a;Java980320 不收取任何费用 在这个宠物领养系统中&#xff0c;我们可以设定两个角色&#xff1a;管理员和普通用户。每个角色的功能和目标略有不同&#xff0c;以下分别介绍&#xff1a; 管理员 管理员的主要职责是确保平台的高效运行&#xff0c…

ES6 变量的解构赋值

数组的解构赋值 对象的解构赋值 字符串的解构赋值

关于我的数据结构与算法——初阶第二篇(排序)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09;。 排序的概念及其运…