当前位置: 首页 > news >正文

[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.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种方法:

 


完~

未经作者同意禁止转载 

相关文章:

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

标题&#xff1a;[Linux] linux 软硬链接与动静态库 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; /** _oo0oo_* o8888888o* 88" . "88* (| -_- |)* …...

GitHub Actions的 CI/CD

GitHub Actions 是一个强大的 CI/CD 工具&#xff0c;适用于自动化各种开发任务。GitHub Actions 的原理是基于事件驱动的自动化流水线工具&#xff0c;通过定义触发条件和执行步骤&#xff0c;可以让项目在特定条件下自动运行一系列操作&#xff0c;比如构建、测试、部署等。 …...

doris 表结构批量导出

导出 test 数据库中的 table1 表&#xff1a;mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1 导出 test 数据库中的 table1 表结构&#xff1a;mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables tab…...

linux查看文件命令

查看文件命令 显示命令 cat 语法&#xff1a;cat 【选项】 文件 选项 命令含义n显示行号包括空行b显示行号不包括空行s压缩空行为一行A显示隐藏字符 cat -n 文件&#xff1a;显示行号包括空行 cat -b 文件 cat -s 文件 cat -A 文件 more和less是 分页查看 tac和rev都…...

【2023工业图像异常检测文献】DiAD: 基于扩散模型的多类异常检测方法

DiAD: A Diffusion-based Framework for Multi-class Anomaly Detection 1、Background 当前主流的三种异常检测方法&#xff1a; 基于合成的方法&#xff1a;在正常图像上合成异常&#xff0c;通过训练模型识别这些合成的异常来提高检测和定位能力。基于嵌入的方法&#xff…...

三相继电保护机 继电器保护校验仪 微机继电保护测试仪

性能特点 电压电流输出灵活组合 输出达4相电压3相电流&#xff0c;可各种组合实现常规4相电压3相电流型输出模式&#xff0c;既可兼容传统的各种试验方式&#xff0c;也可方便地进行三相变压器差动试验和厂用电快切和备自投试验。 操作方式装置直接外接笔记本电脑或台式机进行…...

MyEclipse中讲解Git使用——结合GitLab

1、什么是Git Git是分布式版本控制系统 Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 2、在myeclipse安装Git插件 下载该文件&#xff0c;将egit.zip解压放入 myeclipse安装路径>dropins>下重新启动myeclipse EGit -…...

pdf转为txt文本格式并使用base64加密输出数据

第一步&#xff0c;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. 属性加载优先级 那是否还有其他的配置方式呢&#xff1f; 3. 知识小结 二、开发环境中使用临时属性 1. 如何操作 2. 知识小结 3. 思考 三、配置文件分类 1. 简介 2. 4个级别 3. 为什么设计多种配置文件&#xff1f; 一个典型的应…...

MySQL定时异机备份

场景&#xff1a;将A机器MySQL数据库部分表每日定时备份到B机器上 &#xff08;只适用于Linux&#xff09; 实现方式算是比简单了&#xff0c;就是用mysqldump生成文件&#xff0c;使用scp命令传输到另一台机器上。 1. 编写备份shell脚本 在A机器新建脚本 (当然没有vim的话vi…...

MMA: Multi-Modal Adapter for Vision-Language Models

两个观察 图1所示。各种基于transformer的CLIP模型中不同层的数据集级识别精度。这个实验是为了确定样本属于哪个数据集。我们用不同的种子运行了三次&#xff0c;并报告了每层识别精度的平均值和标准差。 X E m b e d XEmbed XEmbed是指变压器块之前的文本或图像嵌入层&#x…...

uniapp通过id获取div的宽度,高度,位置等(应该是 任意平台都通用 )

uniapp通过id获取div的宽度&#xff0c;高度&#xff0c;位置等&#xff08;应该是 任意平台都通用 &#xff09; <template><view class"" id"domId"></view> </template>// 如果获取的dome高度等不对&#xff0c;还需要加上延迟…...

Python Transformer 模型的基本原理:BERT 和 GPT 以及它们在情感分析中的应用

Transformer 模型的基本原理&#xff1a;BERT 和 GPT 以及它们在情感分析中的应用 近年来&#xff0c;Transformer 模型在自然语言处理&#xff08;NLP&#xff09;领域取得了巨大成功&#xff0c;为任务如翻译、生成文本、问答和情感分析带来了显著的性能提升。本文将介绍 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个关键点&#xff08;由于篇幅限制&#xff0c;这里调整为10个&#xff0c;但实际操作中可能涉及更多细节&#xff09;如下&#xff1a; 1. 创建时间序列数据 时间序列数据是指在多个时间点上形成的数值序列。在Pandas中&#xff0c;可以使用t…...

使用 Mermaid 语言描述 AGI 系统架构图

使用Mermaid语言描述AGI系统架构图 一、整体架构概述 以下是一个简化的AGI&#xff08;Artificial General Intelligence&#xff0c;通用人工智能&#xff09;系统架构的Mermaid描述。该系统主要包括数据收集与预处理、模型训练、推理与决策以及交互接口等模块&#xff0c;各…...

绘制线性可分支持向量机决策边界图 代码解析

### 绘制线性可分支持向量机决策边界图 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

本文全面且深入地探讨了文件上传漏洞相关知识。从基础概念出发&#xff0c;清晰地阐述了文件上传漏洞的定义及其产生的本质原因&#xff0c;同时列出了该漏洞成立的必要条件。详细说明了文件上传漏洞可能对服务器控制权、网站安全以及业务运营带来的严重危害。 文中还深入解析了…...

EasyPlayer.js网页播放器,支持FLV、HLS、WebSocket、WebRTC、H.264/H.265、MP4、ts各种音视频流播放

EasyPlayer.js功能&#xff1a; 1、支持解码H.264视频(Baseline, Main, High Profile全支持&#xff0c;支持解码B帧视频) 2、支持解码H.265视频&#xff08;flv id 12&#xff09; 3、支持解码AAC音频(LC,HE,HEv2 Profile全支持) 4、支持解码MP3音频以及Speex音频格式 5、可…...

WPF数据绑定的五大模式

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软推出的一种用于构建Windows用户界面的UI框架。它支持数据绑定&#xff0c;允许开发者将UI元素与数据源绑定&#xff0c;从而实现数据和界面的自动同步。WPF数据绑定有几种不同的模式&#xff0c; 以下是五种…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...