软硬链接

软硬链接的区别

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

$ 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

硬连接数:

ll

image-20231103192018050

这些数字就硬链接数

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

理解软链接:

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

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

image-20231103190631505

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

image-20231103190746248

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

#include <stdio.h&gt;
 
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.o

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

系统配置文件来做。

原文地址:https://blog.csdn.net/m0_69061857/article/details/134376938

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_29922.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注