Linux下软硬链接和动静态库:别再傻傻分不清楚

在这之前大家很有必要先了解一下Linux的文件结构,相信对大家理解一下内容有很大帮助。

传送门:https://blog.csdn.net/Sun_Life_/article/details/90049499

软硬链接

我们先来看一下Linux下打开一个文件的基本过程:系统通过文件名找到文件的inode索引节点信息,再通过inode来找到数据块打开文件

Linux下软硬链接和动静态库:别再傻傻分不清楚_第1张图片

为了解决文件的共享使用问题,Linux引入了硬链接 (hard link) 软链接(又称符号链接,即soft linksymbolic link)。

链接带来的好处:解决了文件的共享使用问题,还带来了隐藏文件路径、增加权限安全及节省存储等好处。

硬链接

一个inode号对应多个文件名,也就是同一个文件多了个别名,类似于C++当中的引用

创建硬链接

link:link oldfile newfile

ln:ln oldfile newfile

特点

  1. 文件有相同的 inode 及 data block
  2. 只能对已存在的文件进行创建
  3. 不能交叉文件系统进行硬链接的创建
  4. 不能对目录进行创建,只可对文件创建
  5. 删除一个硬链接文件并不影响其他有相同 inode 号的文件

软链接

创建硬链接

ln:ln -s oldfile newfile

文件用户数据块中存放的内容是另一文件的路径名的指向,软链接就是一个普通文件,只是数据块内容有点特殊

  1. 软链接有自己的文件属性及权限等
  2. 可对不存在的文件或目录创建软链接
  3. 软链接可交叉文件系统
  4. 软链接可对文件或目录创建
  5. 创建软链接时,引用计数不会增加
  6. 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)

软硬链接关系示意

Linux下软硬链接和动静态库:别再傻傻分不清楚_第2张图片

总的来说,硬链接就相当于新建另一个启动程序,软链接就相当启动程序的快捷方式

动静态库

在Linux下进行C/C++开发基本都用的gcc编译器,所以对于gcc编译器来说一个C/C++程序的编译过程是这样的:

C/C++程序编译过程

    1.预处理

        展开头文件(#include )、宏定义(#define a  b)、条件编译处理(#ifdef、#ifndef、#else、#elif、#endif等)、特殊符号(LINE、FILE等)。通过 gcc -E source.c -o source.i 或者 cpp source.c 生成 source.i 文件

    2.编译

        将预处理后的文件翻译成汇编代码。通过 gcc -S source.i 生成 source.s 文件

    3.汇编

        将上一步生成的汇编代码生成对应的二进制机器代码。通过gcc -c source.s 生成 source.o 文件

    4.链接

        将生成的目标文件和其引用的符号等生成一个完整的可执行程序。中间会进行虚拟内存重定向操作

Linux下软硬链接和动静态库:别再傻傻分不清楚_第3张图片

动态库(共享库)

在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例

  • 动态库把对一些库函数的链接载入推迟到程序运行的时期。 
  • 可以实现进程之间的资源共享(因此动态库也称为共享库)
  • 将一些程序升级变得简单
  • 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显式调用

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

静态库

在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,因此对应的链接方式称为静态链接。

一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合

特点

  • 静态库对函数库的链接是放在编译时期完成的
  • 程序在运行时与函数库再无联系,方便程序移植
  • 浪费空间和资源,因为所有相关的目标文件与关联到的函数库被链接合成一个可执行文件

你可能感兴趣的:(Linux,动态库,静态库,链接,编译)