【操作系统和计网从入门到深入】(五)软硬链接和动静态库

前言

在这里插入图片描述
这个专栏其实是博主在复习操作系统和计算机网络时候的笔记,所以如果是博主比较熟悉的知识点,博主可能就直接跳过了,但是所有重要的知识点,在这个专栏里面都会提到!而且我也一定会保证这个专栏知识点的完整性,大家可以放心订阅~

复习五·软硬链接和动静态库

1. 软硬链接

1.1 准备工作

在这里插入图片描述
先把这些文件创建好。

1.2 命令学习

先创建一个软链接。

ln -s testLink.txt soft.link

然后创建一个硬链接。

ln testLink.txt hard.link

我们发现,软链接的inode是一个新的inode 硬链接没有新的inode。

软硬链接的本质区别:有没有独立的inode 软链接有独立的inode软链接是一个独立的文件硬链接没有独立的inode硬链接不是一个独立的文件。

软链接:

软链接是干嘛的? 回答:就如同windows下的快捷方式! 这个解释,应该很清晰了!

此时,如果我们这个可执行程序的路径放到一个很复杂的路径下面我们每次在别的路径如果要执行,就很麻烦所以,我们可以利用软链接的方式!

软链接特性:可以理解成软链接的文件内容,就是指向文件对应的路径!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

硬链接:

创建硬链接,是创建新文件吗?不是!

硬链接有inode吗,有inode,创建硬链接究竟做了什么呢?

就是在制定的目录下,建立了文件名和制定的inode的映射关系,仅此而已!说白了,就是起别名!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

硬链接和shared_ptr是一个道理!

所以刚才无论是rm hard.link 还是删除testLink.txt 其实都是引用计数 – 当删到0点时候,才是真正的删除!

一个问题:为什么创建目录的硬链接数是2?

因为当前路径的.,还有里面目录的..都指的是当前目录。

所以怎不用进去么判断一个目录里面有几个目录?看他的硬链接数 减去 2 就行了!

2. 动静态库

解决两个问题:

  1. 如果我想写一个库?
  2. 如果我把库给别人,别人是怎么用的呢?

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

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

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

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

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

2.1 静态库

先做好准备工作:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

库里面,要不要main函数呢?肯定是不能有的,因为库是给别人用的。

然后准备一下头文件和.c文件

我们准备在usrlib这个文件夹里 面去用mklib里面的方法。

如果此时我们只把.h和.o交给别人去用,别人可以用吗?

答案是可以的!

但是,如果.o很多呢?用起来很麻烦怎么办?如果.o丢了一个怎么办?

所以,我们可以把这些.o打包!

这个过程叫做形成静态库(在这种gcc情况下生成的.o完成打包,叫做静态库)

命令:ar

ar -rc libhello.a mymath.o myprint.o

–rc中的r表示替换,c表示创建 库的名字前缀必须是lib,没有原因

后面跟上要打包的.o

此时这个 .a 就是静态库!

现在我们把这个过程自动化一下,用Makefile实现一下

libhello.a:mymath.o myprint.oar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
myprint.o:myprint.cgcc -c myprint.c -o myprint.o
.PHONY:clean
clean:rm -f *.o libhello.a

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在应用的时候,库一般是怎么给别人的呢?

这些规范和习惯一定要注意!

现在要将一个名字为hello的库给别人

  • hello里面要有两个文件夹

  • 第一个叫做include 里面包含了所有的头文件 第二个叫做lib里面包含了所有的库文件

我们可以通过makefile去搞定这些事情

libhello.a:mymath.o myprint.oar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
myprint.o:myprint.cgcc -c myprint.c -o myprint.o.PHONY:hello
hello:mkdir -p hello/libmkdir -p hello/includecp -rf *.h hello/includecp -rf *.a hello/lib.PHONY:clean
clean:rm -f *.o libhello.arm -rf hello

现在我们把这个库交给usrlib里面去用

我们讲三种方法:

第一种:放到gcc的默认搜索路径下去:

  • 头文件 /usr/include
  • /lib64/usr/lib64

我们把我们hello的include拷贝到默认的头文件搜索路径下 把hello的lib拷贝到默认的库路径下。

拷贝过去这个动作叫做库的安装!

拷贝过去之后,直接编译还是不行的。

因为我们这些库都是第三方库,C语言自己的静态库会自己去链接,但是第三方库不会,所以我们gcc的时候要自己加选项去链接。

gcc main.c -lhello

选项怎么写:-l加上libhello.a这个东西东西去掉前缀lib,去掉后缀.o,这个是规定!

不建议用这种方法,因为我们自己写的库是没有进行过可靠性测试的也就是没经过测试的。

直接安装可能会污染别人的头文件和库 所以我们赶紧把刚刚拷贝进去的rm掉,这个过程叫做卸载

然后第二种方法就是显式的调用了。

gcc main.c -I ./hello/include -L ./hello/lib -lhello

-lhello这个选项很容易漏,记得不要漏掉!

2.2 动态库

静态库,是会把代码拷贝进可执行程序的(在链接的时候)。

而动态库,而是让我们自己的程序和动态库和程序产生关联。

libhello.so:mymath_d.o myprint_d.ogcc -shared myprint_d.o mymath_d.o -o libhello.so
mymath.o:mymath.cgcc -fPIC -c mymath.c -o mymath_d.o
myprint.o:myprint.cgcc -fPIC -c myprint.c -o myprint_d.o

-fPIC表示生成一个和位置无关的二进制库

与位置无关表示:可以在任何地址在被加载

同时生成静态库和动态库。

.PHONY:all
all:libhello.so libhello.alibhello.so:mymath_d.o myprint_d.ogcc -shared myprint_d.o mymath_d.o -o libhello.so
mymath_d.o:mymath.cgcc -fPIC -c mymath.c -o mymath_d.o
myprint_d.o:myprint.cgcc -fPIC -c myprint.c -o myprint_d.olibhello.a:mymath.o myprint.oar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
myprint.o:myprint.cgcc -c myprint.c -o myprint.o.PHONY:hello
hello:mkdir -p hello/libmkdir -p hello/includecp -rf *.h hello/includecp -rf *.a hello/libcp -rf *.so hello/lib.PHONY:clean
clean:rm -f *.o libhello.a libhello.sorm -rf hello

怎么用?

浅谈动态库的加载

在这里插入图片描述

怎么用动态库?

丢到这个环境变量里面去。

echo $LD_LIBRARY_PATH

3. 为什么要有库?

  1. 站在使用库的角度,库的存在,可以大大减少我们开发的周期,提高软件本身的质量
  2. 站写写库的人的角度
    1. 简单
    2. 代码安全

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

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

相关文章

通信入门系列——连续卷积定理、循环卷积、离散卷积定理

本节目录 一、连续卷积定理 1、时域卷积定理 2、频域卷积定理 二、循环卷积 三、离散卷积定理本节内容 一、连续卷积定理 卷积定理在信号分析中占有重要的地位,包括时域卷积定理和频域卷积定理。在信号分析领域,通常采用基于卷积定理的时频域分析&#…

Zuul1.x 高并发下阻塞分析以及解决方案

背景 由于最近博主在压测接口的时候发现我接口出现卡死状态,最开始以为是我自己接口出现问题,单独压测我自己的服务(不经过网关)200/qps/10 次循环 是没问题,但是加上网关(zuul 1.x) 去发现 经…

编曲学习:Cubase12导入Cubasis工程的方法!

Steinberg 发布 Cubasis 3 项目导入器,可将 Cubasis 的项目导入到 Cubase 使用https://m.midifan.com/news_body.php?id35635 我偶然看到这个文章,不过发现Cubase12默认好像没有这个选项,心想着要是移动端能和PC端同步,感觉会挺…

【网站项目】基于jsp的199旅游景点管理系统

🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

快速下载百度网盘的文件——使用motrix

问题描述 下载速度慢 上传速度快 解决方案: Motrix 在该开源程序里面 选windows选择zip 启动之后 ,把百度网盘的链接转化成磁力链接。然后输入转化后的连接。转换的网页 每次设置下载认任务是选择高级选项里面的请求头 修改为LogStatistic 然后就能超…

Odrive 学习系列四:如何使用脚本自动初始化odrive配置

一、背景: 在学习markbase的教程后,发现odrive的初始化配置命令确实有点多。尽管odrive有自动补全: 且可以通过 ctrl + → 来快速补全: 但是对初学者而言,仍旧有比较大的工作量。 而针对于此,我们可以通过powershell脚本的方式来解决这个问题。 二、设计初始化…

接口测试 03 -- 接口自动化思维 Requests库应用

1. 接口自动化思维梳理 1.1接口自动化的优点 接口测试自动化,简单来讲就是功能测试用例脚本化然后执行脚本,产生一份可视化测试报告。不管什么样的测试方式,都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢?一句话概括…

项目解决方案:多地医馆的高清视频监控接入汇聚联网

目 录 一、背景 二、建设目标及需求 1.建设目标 2.现状分析 3.需求分析 三、方案设计 1.设计依据 2.设计原则 3.方案设计 3.1 方案描述 3.2 组网说明 四、产品介绍 1.视频监控综合资源管理平台介绍 2.视频录像服务器和存储 2.1概述 2.2存储设计 …

51单片机流水灯

**led 介绍**LED是“Light Emitting Diode”的缩写,即发光二极管。它是一种半导体器件,能够将电能转化为可见光。LED灯通常由LED芯片、封装材料、铝基板和灯罩等部件组成。 **LED灯具有以下特点:** 节能:LED灯具有较高的光电转换…

oracle篇—19c新特性自动索引介绍

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…

Go 知识slice

Go 知识slice 1. 什么是slice2. slice 基础2.1 定义 2.2 实现原理2.2.1 make 创建2.2.2 切片 创建 2.3 操作2.3.1 append 追加2.3.2 表达式切片2.3.3 扩展表达式2.3.4 扩容2.3.5 拷贝 3. 测试一下3.1 len && cap3.2 append && 扩容3.3 切片表达式 1. 什么是sli…

Vue2移动端项目使用$router.go(-1)不生效问题记录

目录 1、this.$router.go(-1) 改成 this.$router.back() 2、存储 from.path,使用 this.$router.push 3、hash模式中使用h5新增的onhashchange事件做hack处理 4、this.$router.go(-1) 之前添加一个 replace 方法 问题背景 : 在 Vue2 的一个移动端开发…

Docker安装与启动

Docker概述 Docker是一个快速交付应用、运行应用的技术: 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器,各个应用互不干扰启动、移除都可以通过一行命令完成,方便…

AttributeError: module ‘numpy‘ has no attribute ‘float‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

YOLOv5改进系列(27)——添加SCConv注意力卷积(CVPR 2023|即插即用的高效卷积模块)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

【Docker】安装Nginx容器并部署前后端分离项目

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Docker实战》。🎯🎯 &…

爬虫requests+综合练习

Day2 - 1.requests第一血_哔哩哔哩_bilibili requests作用:模拟浏览器发请求 requests流程:指定url -> 发起请求 -> 获取响应数据 -> 持续化存储 爬取搜狗首页的页面数据 import requests# 指定url url https://sogou.com # 发起请求 resp…

Three.JS教程1 环境搭建、场景与相机

Three.JS教程1 环境搭建、场景与相机 一、Three.JS简介二、环境搭建1. 开发准备2. 安装 three.js3. 新建文件index.htmlmain.js 4. 关于附加组件5. 启动 三、创建场景1. 场景的概念2. 相机的概念3. 相机的几个相关概念(1)视点(Position&#…

【redis13】集群前奏:sentinel模式

1.哨兵sentinel引入背景 我们现在来思考一个问题:如何实现服务的高可用。我们首先想到至少要满足两个要求:1.服务端能够实现主从自动切换;2.对于客户端来说,如果发生了主从切换,则能够自动连接到最新的master节点。 我…

S/MIME电子邮件证书申请指南

近年来,邮件安全问题日益突出,电子邮件成为诈骗、勒索软件攻击的重灾区。恶意邮件的占比屡创新高,邮件泄密事件更是比比皆是。在如此严峻的网络安全形势下,使用S/MIME电子邮件证书进行邮件收发是当今最佳的邮件安全解决方案之一。…