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

这篇具有很好参考价值的文章主要介绍了【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

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

这些数字就硬链接数

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

理解软链接:

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

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

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

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

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

我们创建一个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 就可以运行。

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

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

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

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

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

直接./my.exe解放双手

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

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

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

软硬链接的删除:

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

unlike 文件名

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

动静态库:

什么是动静态库?

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

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

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

动态链接和静态链接:

动态链接:

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

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

静态链接:

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

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

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

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

生成动静态库:

生成静态库:

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

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

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

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

生成动态库:

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

gcc -fPIC -c myadd.c -o myadd.o

gcc -shared -o libmyadd.so myadd.o

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

【Linux】软硬链接和动静态库,Linux,linux,chrome,运维

使用静态库和动态库:

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

使用动态库

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

-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。

③ 系统配置文件来做。文章来源地址https://www.toymoban.com/news/detail-752624.html

不需要运行时查找。

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

error while loading shared libraries 解决方案:

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

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

③ 系统配置文件来做。

到了这里,关于【Linux】软硬链接和动静态库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】软硬链接与动静态库

    相关文章: 【Linux】动静态库以及动静态链接 【Linux】基础IO_文件系统 我们知道,每一个文件都会有自己的inode编号,我们可以通过如下指令来查看:  我们发现, 每一个不同文件的inode编号都不相同,所以inode可以说是用来标识文件的标识符 。接下来,我们通过下面指令来

    2024年02月10日
    浏览(48)
  • 【看表情包学Linux】软硬链接 | 软连接数 | 创建软硬链接 | 动静态库 | 生成静态库 | 生成动态库

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 上一章我们讲解了 inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困

    2024年02月14日
    浏览(48)
  • 【看表情包学Linux】软硬链接 | 动静态库

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 上一章我们讲解了 inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困

    2024年02月16日
    浏览(44)
  • Linux基础IO【软硬链接与动静态库】

    ✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 假设你下载了一款游戏,你是否会跑到游戏所在目录中双击 .exe 打开游戏?答案是不会,大多数人都会通过桌面的快捷方式直接打开文件,而这个快捷方式实际就是对 .exe 的 软链接 文

    2024年02月02日
    浏览(40)
  • 【Linux】基础IO——文件系统|软硬链接|动静态库

    基于上篇博客所写到的文件各种操作都是基于被打开文件所进行操作的,那么如果一个文件没有被打开它存在哪里呢?这个答案毫无疑问肯定是存在于磁盘上的。那么,对于一个没有打开的文件(也就是磁盘文件)我们应该如何理解呢? 这里我们所要讲的磁盘是机械硬盘、即

    2024年02月04日
    浏览(51)
  • 【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 软链接和硬链接是在Linux系统中常见的文件链接方式。 软链接(Symbolic Link): 软链接是一个指向目标文

    2024年04月13日
    浏览(45)
  • [Linux]理解文件系统!动静态库详细制作使用!(缓冲区、inode、软硬链接、动静态库)

            hello,大家好,这里是bang___bang_,今天来谈谈的文件系统知识,包含有缓冲区、inode、软硬链接、动静态库。本篇旨在分享记录知识,如有需要,希望能有所帮助。 目录 1️⃣缓冲区 🍙缓冲区的意义 🍙常见缓冲区刷新策略 🍙缓冲区位置猜想 🍥现象猜测 🍥现象解

    2024年02月13日
    浏览(50)
  • 【探索Linux】—— 强大的命令行工具 P.13(文件系统 | 软硬链接 | 动态库和静态库)

    在计算机科学领域中,Linux 系统一直以来都是备受推崇的操作系统之一。其中,文件系统、软硬链接、动态库和静态库是 Linux 系统中非常重要的概念,在实际应用中扮演着不可或缺的角色。 在上一篇文章中,我们了解了 Linux 系统中文件描述符、重定向以及基础 IO 操作的相关

    2024年02月04日
    浏览(55)
  • 【Linux】-- 基础IO和动静态库

    对于C文件接口,假如想向特定文件写入字符串: cFile.c 执行结果如下,查看log.txt文件: 假如想从特定文件读字符串,从log.txt中按行读取,读取的内容放在缓冲区,如果fgets读取成功,返回读取的新字符串的地址,如果读取失败就返回NULL,feof用来判断文件是否正常退出,即

    2024年02月07日
    浏览(43)
  • linux之文件系统、inode和动静态库制作和发布

    1.没有被打开的文件都在磁盘上  --- 磁盘级文件 2.对磁盘级别的文件,我们的侧重点 单个文件角度 -- 这个文件在哪里,有多大,其他属性是什么? 站在系统角度 --  一共有多少文件?各自属性在哪里?如何快速找到?可以存储多少个文件?如何快速找到指定文件?如何对此

    2024年04月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包