Linux软硬连接与动静态库

硬链接

我们可以通过命令 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.oar -rc -o $(mylib) $^
%.o:%.c$(CC) -c $<.PHONY:clean
clean:rm -f $(mylib) ./*.o.PHONY:output
output:mkdir -p Datelib/includemkdir -p Datelib/libcp ./*.h Datelib/includecp ./*.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.hqwc.cn/news/125493.html

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

相关文章

数学建模Matlab之数据预处理方法

本文综合代码来自文章http://t.csdnimg.cn/P5zOD 异常值与缺失值处理 %% 数据修复 % 判断缺失值和异常值并修复&#xff0c;顺便光滑噪音&#xff0c;渡边笔记 clc,clear;close all; x 0:0.06:10; y sin(x)0.2*rand(size(x)); y(22:34) NaN; % 模拟缺失值 y(89:95) 50;% 模…

Ros2 学习02- ubuntu22.04 安装ros2

设置镜像源 sudo vim /etc/apt/sources.list#阿里源 deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jamm…

linux下的永久保存行号

linux下的永久保存行号 1.首先 这里是引用 输入命令&#xff1a;vi ~/.vimrc 其次 这里是引用 输入命令 set number

Spring 体系架构模块和三大核心组件介绍

Spring架构图 模块介绍 1. Spring Core&#xff08;核心容器&#xff09;&#xff1a;提供了IOC,DI,Bean配置装载创建的核心实现。 spring-core &#xff1a;IOC和DI的基本实现 spring-beans&#xff1a;BeanFactory和Bean的装配管理(BeanFactory) spring-context&#xff1…

深度学习 图像分割 PSPNet 论文复现(训练 测试 可视化)

Table of Contents 一、PSPNet 介绍1、原理阐述2、论文解释3、网络模型 二、部署实现1、PASCAL VOC 20122、模型训练3、度量指标4、结果分析5、图像测试 一、PSPNet 介绍 PSPNet(Pyramid Scene Parsing Network)来自于CVPR2017的一篇文章&#xff0c;中文翻译为金字塔场景解析…

创建django文件

1、在指定目录里打开终端&#xff0c;输入D:\Softwares\Anaconda3\envs\pytorch\Scripts\django-admin .exe startproject 名称 &#xff0c;即可在对应目录里创建django文件。

私有云盘:lamp部署nextcloud+高可用集群

目录 一、实验准备&#xff1a; 二、配置mariadb主从复制 三台主机下载mariadb 1&#xff09;主的操作 2&#xff09;从的操作 3&#xff09;测试数据是否同步 三、配置nfs让web服务挂载 1、安装 2、配置nfs服务器 3、配置web服务的httpd 4、测试 四、web 服务器 配…

黑豹程序员-架构师学习路线图-百科:CSS-网页三剑客

文章目录 1、为什么需要CSS2、发展历史3、什么是CSS4、什么是SASS、SCSS 1、为什么需要CSS 作为网页三剑客的第二&#xff0c;CSS为何需要它&#xff0c;非常简单HTML只能完成页面的展现&#xff0c;但其做出来的页面奇丑无比。 随着网络的普及&#xff0c;人们的要求更高&…

微信支付费率降低到0.2%,商家收款开户手续费0.6%降低的操作方法

在如今的数字时代&#xff0c;移动支付已成为人们日常生活中必不可少的一部分。微信支付作为国内最受欢迎的移动支付平台&#xff0c;一直致力于为商家和个人提供最便捷、安全的支付方式。如果可以将微信支付将费率降低到仅为0.2%&#xff0c;这无疑给广大商家带来了巨大的利好…

Golang 中的调试技巧

掌握有效的策略和工具&#xff0c;实现顺畅的开发 调试是每位开发人员都必须掌握的关键技能。它是识别、隔离和解决代码库中问题的过程。在 Golang 的世界中&#xff0c;掌握有效的调试技巧可以显著提升您的开发工作流程&#xff0c;并帮助您创建更可靠和健壮的应用程序。在本…

软件设计师_计算机网络_学习笔记

文章目录 4.1 网路技术标准与协议4.1.1 协议4.1.2 DHCP4.1.3 DNS的两种查询方式 4.2 计算机网络的分类4.2.1 拓扑结构 4.3 网络规划与设计4.3.1 遵循的原则4.3.2 逻辑网络设计4.3.3 物理网络设计4.3.4 分层设计 4.4 IP地址与子网划分4.4.1 子网划分4.4.2 特殊IP 4.5 HTML4.6 无…

全排列[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个不含重复数字的数组nums&#xff0c;返回其所有可能的全排列。你可以按任意顺序返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例…