Linux软硬连接与动静态库

news2024/11/28 20:48:38

硬链接

我们可以通过命令 ln myproc myproc-h  创建硬链接。
23abb2b89de343ceab86d66765a11108.png
很容易发现 test(源文件) 和 mytest (硬链接)的文件大小是一样的,mytest的硬链接数从 1-> 2
97e4cf4d6ac74353aa6db95016924329.png

通过 ls -i 文件名 我们还会发现,test 和 mytest-h的inode编号是一样的。

f90c27eb8f1f4634825c4b205bdf17d8.png

软链接

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,我们可以通过以下命令创建一个文件的软连接
aa1f187442104ede812625930f1dfe71.png

通过ls -i -l命令我们可以看到,软链接文件的inode号与源文件的inode号是不同的,并且软链接文件的大小比源文件的大小要小得多。

8fabb7a749484521805240cfecbd6ef7.png

总结:

软连接就好比windows下的快捷方式,当软件删除后,快捷方式就没用了,同理软连接在源文件删除后也无法使用,但硬链接文件大小和源文件是一样的,删除文件在某方面来说就是将硬链接数减少,彻底删除就是将硬链接数置为0。

acm

通过 stat 文件名 我们可以看到以下数据
7030a66e578f47968d485d8bcfbaa180.png
下面解释一下文件的三个时间:
                Access 最后访问时间
                Modify 文件内容最后修改时间
                Change 属性最后修改时间
 

静态库与动态库

 认识动静态库

 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚 拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

动静态库的优点和缺点

静态库:

优点:使用静态库生成可执行程序后,该可执行程序就可以独自运行,不再需要库了。

缺点:使用静态库生成可执行程序会占用大量空间,特别是当有多个静态程序同时加载而这些静态程序使用的都是相同的库,这时在内存当中就会存在大量的重复代码。

动态库:

优点:节省磁盘空间,且多个用到相同动态库的程序同时运行时,库文件会通过进程地址空间进行共享,内存当中不会存在重复代码。

缺点:必须依赖动态库,否则无法运行

动静态库的生成

生成静态库

 第一步:让所有源文件生成对应的目标文件;
第二步:使用ar命令将所有目标文件打包为静态库;
第三步:将头文件和生成的静态库组织起来
示例:
将下列文件打包成静态库
e67136d3f2644c37984b72a5adaa07fb.png
Date.h
#pragma once
#include<stdio.h>
extern void mydate(int x, int y);

Date.c

#include "Date.h"

void my_sub(int x, int y)
{
	printf(" %d月 %d 日\n");
}
Log.h
#pragma once
#include <stdio.h>
extern void my_log(char*str);
Log.c
#include "Log.h"

void my_log(char*str)
{
    printf("%s",str);
}
通过一个Makefile文件将他们组织起来
mylib=libcal.a
CC=gcc
$(mylib):Date.o Log.o
	ar -rc -o $(mylib) $^
%.o:%.c
	$(CC) -c $<

.PHONY:clean
clean:
	rm -f $(mylib) ./*.o

.PHONY:output
output:
	mkdir -p Datelib/include
	mkdir -p Datelib/lib
	cp ./*.h Datelib/include
	cp ./*.a Datelib/include

75f2f7ad637f4661baa18f7fb3d8618a.png

生成动态库

动静态库的使用

动态库和静态库是两种常用的库文件形式,它们都是用于存储和管理可重用的代码的。下面我将分别介绍它们的使用。

使用动态库
1. 动态库在程序运行时被加载到内存中,多个程序可以共享同一个动态库的实例。
2. 创建动态库也需要两个步骤:编译和链接。和静态库不同的是,创建动态库时需要生成共享目标文件(.so 或 .dll)。
3. 在程序中使用动态库时,需要在编译阶段指定头文件的位置,然后在链接阶段指定库文件的位置和名称。同样,可以使用 `-l` 和 `-L` 选项来指定。
4. 动态库适合于大规模工程或需要动态加载和卸载的应用,因为它可以减小可执行文件的体积,并且可以在运行时替换和更新动态库。
使用静态库
1. 静态库是在链接时被拷贝到可执行文件中的,因此可执行文件独立于静态库的存在。
2. 创建静态库需要两个步骤:编译和打包。首先,将源代码编译成目标文件(.o 或 .obj),然后将目标文件打包成静态库文件(.a 或 .lib)。
3. 在程序中使用静态库时,需要在编译和链接阶段指定库文件的位置和名称。可以使用 `-l` 编译选项指定库名,使用 `-L` 选项指定库文件的搜索路径。
4. 静态库适合于小规模工程或具有固定依赖关系的应用,因为每个可执行文件都包含了静态库的副本,可能会导致可执行文件体积较大。但是它也具有更好的兼容性和移植性
 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10以内字符与数字的转化(与ASCII码无关)

字符转整型数字 char a3; int ba1; cout<<b; 这样打印出的结果是51&#xff1b;显然我们想打印出的结果是4&#xff1b; 那么下面介绍一种极其简单的方法&#xff1b; 1.利用“ -0 ” char a6; int ba-01; cout<<b; 输出结果就是7&#xff1b; 不过这种方…

Vue--Axios详解

一、Axios是什么&#xff1f; Axios是一种异步请求技术&#xff0c;核心作用就是用来给页面 发送异步请求的&#xff0c;并获取对应数据在页面中的渲染&#xff0c;是页面局部更新的Ajax封装来的。 特性 从浏览器创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise A…

【Vue3】兄弟组件传参

1. 借助父组件传参 A 组件派发一个事件&#xff0c;修改 flag 的值&#xff0c;先传递给父组件&#xff0c;然后由父组件传递给 B 组件。 缺点&#xff1a;必须由 App.vue 处理中间逻辑。 A.vue <template><div class"A"><h1>A组件</h1>…

Tomcat8 任意写文件PUT方法 (CVE-2017-12615)

Tomcat 任意写文件PUT方法 (CVE-2017-12615) 文章目录 Tomcat 任意写文件PUT方法 (CVE-2017-12615)1 在线漏洞解读:2 版本影响3 环境搭建4 漏洞复现4.1 访问4.2 POC攻击点4.2.1 直接发送以下数据包&#xff0c;然后shell将被写入Web根目录。4.2.2 访问是否通&#xff0c;可以访…

零基础Linux_10(进程)进程终止(main函数的返回值)+进程等待

目录 1. 进程终止 1.1 main函数的返回值 1.2 进程退出码和错误码 1.3 进程终止的常见方法 2. 进程等待 2.1 进程等待的原因 2.2 wait 函数 2.3 waitpid 函数 2.4 int* status参数 2.5 int options非阻塞等待 本篇完。 1. 进程终止 进程终止指的就是程序执行结束了&…

Linux命令之查看用户登录信息命令

一、命令简介 linux系统查看用户登录信息的命令有很多&#xff0c;包括w、who、whoami、users、last、lastb、lastlog、id、finger等。每个命令都可以查看当前登录的用户&#xff0c;但是又各有侧重点。w还可以查看用户正在执行的命令&#xff1b;who可以查看系统的启动时间&am…

Linux学习[21]账号与群组1---linux中/etc/passwd与/etc/shadow字段说明

文章目录 前言1. passwd字段说明2. shadow字段说明总结 前言 修改树莓派某个用户的权限到管理员权限的时候&#xff0c;涉及到了对/etc/passwd文件的修改&#xff0c;其中的字段具体含义当时也是模棱两可的&#xff0c;最近看了看相关书籍之后&#xff0c;这里做一个说明。 同…

AIGC Midjourney 机器人绘画案例演示

输入提示词后,点击生成图片即可。 根据描述生成了高清图像。 AIGC ChatGPT 职场案例60集, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu<

39 对称二叉树

对称二叉树 理解题意&#xff1a;如果同时满足下面的条件&#xff0c;两个树互为镜像&#xff1a;题解1 【栈】递归——DFS题解2 【队列】迭代——BFS 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 提示&#xff1a; 树中节点数目在范围 [1, 1000] 内-100 &l…

Acwing 240. 食物链

Acwing 240. 食物链 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 #include <iostream>using namespace std;const int N 50010;int n, m; int p[N], d[N]; //p[]是并查集的father,d[]是距离int find(int x) {if (p[x] ! x) { //如果说x不是树根的话int t f…

【VIM】VIM配合使用的工具

6-1 课程总结-vim虐我千百遍&#xff0c;我待 vim 如初恋_哔哩哔哩_bilibili

吐槽挡不住iPhone15的热销,这就是苹果的实力,库克笑开怀

从某电商平台可以看到苹果的iPhone15Pro max的评论已高达200万条&#xff0c;对比之下竞争对手的某款手机评论仅仅只有200条&#xff0c;可以看出虽然一些人士指出该款手机狙击了iPhone15&#xff0c;而iPhone15在销售方面并未受到影响。 iPhone15在发布前后引发了诸多风波&…

lv5 嵌入式开发-9 信号机制(上)

目录 1 信号机制 2 信号的产生 3 常用信号 4 相关命令 4.1 信号相关命令 kill / killall 4.2 信号发送 – kill / raise 4.3 定时器函数相关函数 – alarm /ualarm/ pause 4.4 信号捕捉&#xff1a;设置信号响应方式 – signal /sigaction&#xff0c;闹钟实现 4.5 子…

面试官让手撕红黑树,我直接向他秀一手手撕map与set

文章目录 一、map与set的STL源码分析二、改造红黑树1.基本结构2.比较 三、迭代器1.STL源码分析2. 迭代器3. 与库里面的迭代器的差异 四、map的[]操作五、map与set完整代码 一、map与set的STL源码分析 我们首先可以观察到&#xff0c;在set和map中包含有如下的头文件 于是我们可…

28299-2012 结构用热轧翼板钢 课堂随笔

声明 本文是学习GB-T 28299-2012 结构用热轧翼板钢. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了结构用热轧翼板钢的订货内容、尺寸、外形、重量及允许偏差、技术要求、试验方法、检 验规则、包装、标志和质量证明书等。 本…

Python绘图系统24:添加辅助坐标轴

文章目录 辅助坐标增减坐标轴时间轴**代码优化源代码 Python绘图系统&#xff1a; 前置源码&#xff1a; Python打造动态绘图系统&#x1f4c8;一 三维绘图系统 &#x1f4c8;二 多图绘制系统&#x1f4c8;三 坐 标 轴 定 制&#x1f4c8;四 定制绘图风格 &#x1f4c8;五 数据…

面试必考精华版Leetcode199. 二叉树的右视图

题目&#xff1a; 代码&#xff08;首刷看解析&#xff09;&#xff1a; class Solution { public:vector<int> rightSideView(TreeNode* root) {unordered_map<int,int> rightmostvalue;queue<TreeNode*> nodeQueue;queue<int> depthQueue;int maxDe…

上古神器:十六位应用程序 Debug 的基本使用

文章目录 参考环境上古神器 DebugBug 与 DebuggingDebugDebug 应用程序淘汰原因使用限制 DOSBox学习 Debug 的必要性DOSBox-X Debug 的基本使用命令 R查看寄存器的状态修改寄存器的内容 命令 D显示内存中的数据指定起始内存空间地址指定内存空间的范围 命令 A使用命令语法错误查…

第8章 Spring(二)

8.11 Spring 中哪些情况下,不能解决循环依赖问题 难度:★★ 重点:★★ 白话解析 有一下几种情况,循环依赖是不能解决的: 1、原型模式下的循环依赖没办法解决; 假设Girl中依赖了Boy,Boy中依赖了Girl;在实例化Girl的时候要注入Boy,此时没有Boy,因为是原型模式,每次都…