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

软硬链接

软硬链接的区别:

  • **软链接:**是一个独立文件,有自己独立的 inode 和 inode 编号。
  • **硬链接:**不是一个独立的文件,它和目标文件使用的是同一个 inode。硬链接就是单纯的在 Linux 指定的目录下,给指定的文件新增 文件名 和 inode 编号的映射关系!

我们可以通过如下命令,创建一个文件的软硬链接:

$ ln -s 文件名 链接文件名    # 创建软连接
$ ln 文件名 链接文件名       # 创建硬链接

理解硬链接:

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个
inode。

[root@localhost linux]# touch abc [root@localhost linux]# ln abc def 
[root@localhost linux]# ls -1i
abc def 263466 abc 263466 def
  • abc和def的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数,inode

    263466 的硬连接数为2。

  • 我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应

    的磁盘释放。

硬连接数:

ll

image-20231103192018050

这些数字就硬链接数

硬链接本质就是该文件 inode 属性中的一个计数器 count。用来标识就几个文件名和我的 inode 建立了映射关系。简而言之,就是有自己文件名指向我的 inode (文件本身) 。

理解软链接:

我们创建一个软连接,可以使用下面的指令:

$ ln -s 文件名 链接文件名    # 创建软连接

image-20231103190631505

我们可以很明显的发现他们的inode不同

image-20231103190746248

我们创建一个mytest.c,内容如下:

#include <stdio.h>int main(void) {printf("hello, soft link...\n");printf("hello, soft link...\n");printf("hello, soft link...\n");printf("hello, soft link...\n");printf("hello, soft link...\n");printf("hello, soft link...\n");return 0;
}

程序正常运行,这里我们在 上级目录的上级目录 下直接 ./mytest.exe 就可以运行。

但是,如果我们如果想在外面运行这个程序就会很累,因为它的路径有点深:

image-20231103191250575

太麻烦了,所以这里我们就可以给它建立一个软连接,解脱双手:

$ ln -s ./lesson18/mytest.exe my.exe

image-20231103191421825

直接./my.exe解放双手

image-20231103191536764

这就很像window下的快捷桌面方式(忽略右上角的红色软件,我是爱学习的孩子)

image-20231103191628076

软硬链接的删除:

删除的话可以直接 rm,但是我们还是建议使用专门的 取消链接 的指令:unlink

unlike 文件名

image-20231103191802832

动静态库:

什么是动静态库?

动态库 .so:程序在运行的时才去链接动态库的代码,多个程序共享使用库的代码。

静态库 .a:程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文
件的整个机器码

动态链接和静态链接:

动态链接:

在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个
过程称为动态链接(dynamic linking)

动态库可以在多个程序间共享,所以 动态链接使得可执行文件更小,节省了磁盘空间。 操作系统采用虚拟内存 (VM) 机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

静态链接:

静态链接比较暴力,链接时候直接将目标接口的二进制代码全部链接到原文件中去,这也就是静态链接生成的文件这么大的原因了;(毕竟把二进制代码copy过来了)

但是这些都是相对的,有优点就有缺点:

万一动态库路径中的库丢失损坏 ,动态链接的程序到目标位置了,过来用的时候肯定出错了;

静态链接因为编译的时候吧二进制代码考过去了,不依赖原生库,即便原库代码丢失也没事;

生成动静态库:

生成静态库:

$ ar -rc [静态库] [.o]

库的命名以 lib 开头,静态库以 .a 结尾,

image-20231103193821301

此时我们就有了静态库,所谓了静态库就是曾经的源文件最终将它翻译成 .o 打包起来的东西而已。而别人用我们的库,就是在库里找到 .o 然后丢到而可执行程序里就行。

生成动态库:

动态库比静态库要复杂一些,

gcc -fPIC -c myadd.c -o myadd.ogcc -shared -o libmyadd.so myadd.o

别在于 形成 .o 的时候是需要加上 gcc -fPIC 的,这是为了产生 与位置无关码

image-20231103194631708

使用静态库和动态库:

现在我们站在使用的人的角度,学习如何使用静态库和动态库

使用动态库

-Ⅰ 表示我们的头文件查找的路径

-L 表示库文件搜索的路径

-l 在-L 指定的路径下你要链接哪一个库.
示例:

gcc mytest.c -o mytest -I lib-dyl/include/ -L lib-dyl/lib/ -l mymath

形成可执行程序之后,已经把需要的代码拷贝到我的代码中,运行时不依赖你的库。不需要运行时查找。

为什么动态库会有这个问题?想办法让进程找到动态库即可。

error while loading shared libraries 解决方案:

① 动态库拷贝到系统路径下 /lib64 安装。

② 通过导入环境变量的方式 —— 程序运行的时候,会在环境变量中查找自己需要的动态库路径 —— LD_LIBRARY_PATH。

③ 系统配置文件来做。

不需要运行时查找。

为什么动态库会有这个问题?想办法让进程找到动态库即可。

error while loading shared libraries 解决方案:

① 动态库拷贝到系统路径下 /lib64 安装。

② 通过导入环境变量的方式 —— 程序运行的时候,会在环境变量中查找自己需要的动态库路径 —— LD_LIBRARY_PATH。

③ 系统配置文件来做。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决k8s通过traefik暴露域名失败并报错:Connection Refused的问题

我敢说本篇文章是网上为数不多的解决traefik暴露域名失败问题的正确文章。 我看了网上太多讲述traefik夸夸其谈的文章了&#xff0c;包含一大堆复制粘贴的水文和还有什么所谓“阿里技术专家”的文章&#xff0c;讲的全都是错的&#xff01;基本没有一个能说到点子上去&#xf…

VSCode配置msvc编译调试环境

1.VS Code简介 VS Code 使用 Electron 框架构建用户界面,该框架使用 Chromium 和 Node.js 构建桌面应用程序。这使得 VS Code 能够在 Windows、Linux 和 macOS 上运行,并且可以使用 Web 技术 (HTML、CSS 和 JavaScript) 构建用户界面。 VS Code 使用 Monaco 引擎来提供文本编辑…

Visual Studio Code安装和设置中文

文章目录 Visual Studio Code安装Visual Studio Code设置中文 步骤如下: Visual Studio Code安装 1.下载安装包 VS Code的官网 下载链接中的“az764295.vo.msecnd.net” 替换为国内镜像地址“vscode.cdn.azure.cn”&#xff0c;下载速度直接飙升至几十 Mb/s。(在官网下载速度…

Linux 图形界面配置RAID

目录 RAID 1 配置 RAID 5配置 , RAID 配置起来要比 LVM 方便&#xff0c;因为它不像 LVM 那样分了物理卷、卷组和逻辑卷三层&#xff0c;而且每层都需要配置。我们在图形安装界面中配置 RAID 1和 RAID 5&#xff0c;先来看看 RAID 1 的配置方法。 RAID 1 配置 配置 RAID 1…

sql查询结果跟in传入参数顺序一致

Orcle、postgresql、td-sql中可以使用如下语句 select namefrom tbl_user_infowhere id in (4,3,1)order by instr(4,3,1,id);查询结果&#xff1a;

开源项目datavines内存泄漏问题分析

应用程序开启JMX java -Dspring.profiles.activemysql -Dcom.sun.management.jmxremote.port1099 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse -Djava.rmi.server.hostname127.0.0.1 -jar dataVines.jar 通过jdk自带工具&…

Reids集群

目录 一、集群的概念 1.为什么要搭建集群&#xff1f; 2.Redis搭建集群是否需要考虑状态同步的问题&#xff1f; 二、Redis集群的模式 1.redis集群--主从模式 1.1什么是Redis的主从模式&#xff1f; 1.2.主从模式它们之间的数据是怎么实现一个同步的&#xff1f; 1.3.主…

NovelD: A Simple yet Effective Exploration Criterion论文笔记

NovelD:一种简单而有效的探索准则 1、Motivation 针对稀疏奖励环境下的智能体探索问题&#xff0c;许多工作中采用各种内在奖励(Intrinsic Reward)设计来指导困难探索环境中的探索 &#xff0c;例如&#xff1a; ICM&#xff1a;基于前向动力学模型的好奇心驱动探索RND&…

【Qt-23】Qt charts绘制曲线图

一、QChart简介 QChart是Qt中专门用于绘制图表的模块&#xff0c;支持折线图、柱状图、饼图等常见类型。其主要组成部分有&#xff1a; QChart&#xff1a;整个图表的容器&#xff0c;管理图表中的所有数据和图形属性QChartView&#xff1a;继承自QGraphicsView&#xff0c;用于…

蓝桥杯算法心得——拼数(排列型回溯dfs)

大家好&#xff0c;我是晴天学长&#xff0c;排列型的dfs&#xff0c;在一些需要暴搜的题中很中很重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .拼数 2) .算法思路 超级递归 1.遍历数组&#…

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁

文章目录 &#x1f339;简述&#x1f384;全局锁⭐数据备份&#x1f388;设置全局锁&#x1f388;对表进行备份&#x1f388;释放锁 &#x1f384;表级锁&#x1f6f8;表锁⭐读锁⭐写锁 &#x1f6f8;元数据锁&#x1f6f8;意向锁⭐意向共享锁⭐意向排他锁 &#x1f384;行级锁…