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

news2024/12/27 2:41:02

前言

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

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

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.o
	ar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.c
	gcc -c mymath.c -o mymath.o
myprint.o:myprint.c
	gcc -c myprint.c -o myprint.o
.PHONY:clean
clean:
	rm -f *.o libhello.a

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

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

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

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

  • hello里面要有两个文件夹

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

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

libhello.a:mymath.o myprint.o
	ar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.c
	gcc -c mymath.c -o mymath.o
myprint.o:myprint.c
	gcc -c myprint.c -o myprint.o

.PHONY:hello
hello:
	mkdir -p hello/lib
	mkdir -p hello/include
	cp -rf *.h hello/include
	cp -rf *.a hello/lib

.PHONY:clean
clean:
	rm -f *.o libhello.a
	rm -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.o
	gcc -shared myprint_d.o mymath_d.o -o libhello.so
mymath.o:mymath.c
	gcc -fPIC -c mymath.c -o mymath_d.o
myprint.o:myprint.c
	gcc -fPIC -c myprint.c -o myprint_d.o

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

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

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

.PHONY:all
all:libhello.so libhello.a

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

libhello.a:mymath.o myprint.o
	ar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.c
	gcc -c mymath.c -o mymath.o
myprint.o:myprint.c
	gcc -c myprint.c -o myprint.o

.PHONY:hello
hello:
	mkdir -p hello/lib
	mkdir -p hello/include
	cp -rf *.h hello/include
	cp -rf *.a hello/lib
	cp -rf *.so hello/lib

.PHONY:clean
clean:
	rm -f *.o libhello.a libhello.so
	rm -rf hello

怎么用?

浅谈动态库的加载

在这里插入图片描述

怎么用动态库?

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

echo $LD_LIBRARY_PATH

3. 为什么要有库?

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

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

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

相关文章

使用RSVP进行带宽预留

使用RSVP进行带宽预留 服务质量(QoS)工具包括 标记, 管制和 整形 机制,主要是区分服务(DiffServ)工具。DiffServ机制可提供带宽保证(在各种刚性级别上),但是它们都不提供…

Three.js 学习笔记之模型(学习中1.20更新) | 组 - 模型 - 几何体 - 材质

文章目录 模型 几何体 材质层级模型组- THREE.Group递归遍历模型树结构object3D.traverse() 模型点模型Points - 用于显示点线模型Line | LineLoop | LineSegments网格模型mesh - 三角形网格模型独有的属性与方法 几何体BufferGeometry缓冲类型几何体BufferGeometry - 基类创…

【Android】app中阻塞的looper为什么可以响应touch事件

这里,我们考虑一个问题,Android中的应用是一个looper线程,没有任务时就阻塞着,其他线程通过handler调用等方式向主线程looper发送任务, 如果点击应用上的按钮,应用是怎么及时响应的呢, 是专门启…

JS-WebAPIs- Window对象(五)

• BOM(浏览器对象模型) BOM(Browser Object Model ) 是浏览器对象模型 window对象是一个全局对象,也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性,基本BOM的属性和方法都是window的。所有通过var定义在全局…

提升 Go 编程:Go 1.22 中有哪些新特性?

深入了解 Go 1.22 版本及其语言增强功能 随着 Go 编程语言的不断发展,即将发布的版本 Go 1.22 承诺带来各种新功能、改进和变化。预计于 2024 年 2 月发布的 Go 1.22 引入了对语言、工具、运行时、编译器和核心库的增强。让我们深入了解一些在这个即将发布的版本中开…

python基础语法(下)—— python中的元组、集合、字典、类与异常的处理

文章目录 8.python中的元组8.1元组的初始化8.2元组的解包8.3元组的比较运算8.4else 9.python中的集合9.1集合的初始化9.2集合的常用操作9.3使用for循环遍历集合 10.python中的字典10.1字典的初始化10.2字典的常见操作10.3使用for循环遍历字典 11.python中的类11.1类的定义11.2类…

二进制部署高可用k8s集群V1.20.11版本

文章目录 一、操作系统初始化配置(所有节点均执行)1、关闭防火墙2、关闭selinux3、关闭swap4、根据规划修改主机名5、在master节点上添加host6、将桥接的IPv4流量传递到iptables的链7、时间同步 二、部署Etcd集群1、准备cfssl证书生成工具2、生成Etcd证书…

B(l)utter:一款针对Flutter移动端应用程序的逆向工程分析工具

关于B(l)utter B(l)utter是一款针对Flutter移动端应用程序的逆向工程分析工具,当前版本的B(l)utter仅支持Android libapp.so(ARM64),可以帮助广大研究人员对基于Flutter开发的移动端应用程序进行逆向工程分析。 环境搭建 该应用…

C++参悟:正则表达式库regex

正则表达式库regex 一、概述二、快速上手Demo1. 查找字符串2. 匹配字符串3. 替换字符串 三、类关系梳理1. 主类1. basic_regex 2. 算法1. regex_match2. regex_search3. regex_replace 3. 迭代器4. 异常5. 特征6. 常量1. syntax_option_type2. match_flag_type3. error_type 一…

6.3.5编辑视频

6.3.5编辑视频 除了上面的功能外,Camtasia4还能进行简单的视频编辑工作,如媒体的剪辑、连接、画中画等。 下面我们就利用Camtasia4的强大功能来实现一个画中画效果,在具体操作之前,需要准备好两个视频文件,一个作为主…

C++:练习:类的一些简单例题(学习编程的前期需要大量的读和写基本C++代码)

2014年1月21日 内容整理自《程序设计教程:用C语言编程 第三版》 陈家骏 郑滔 --------------------------------------------------------------------------------------------------------------------------------- 例题1:用类来实现“栈”这一数…

(二十三)Kubernetes系列之prometheus+grafana安装

1.kube-prometheus安装 1.1 下载 访问地址:https://github.com/prometheus-operator/kube-prometheus/releases 点击Source code (tar.gz)进行下载,并上传到k8s服务器master节点 1.2解压 tar zxvf kube-prometheus-0.11.0.tar.gz 1.3进入kube-prome…

2024年黑龙江事业单位招聘报名详细流程图解,千万不要错过报名哦

⭐报名入口:入黑龙江省事业单位公开招聘服务平台 ✅报名时间:2024年1月22日9:00-1月26日17:00 ✅笔试联考:2024年3月30日 报名流程如下,具体可查看笔记详细图解 第一步,注册及登录,新用户注册新账号。 第二…

【数据结构】单链表的基本操作 (C语言版)

目录 一、单链表 1、单链表的定义: 2、单链表的优缺点: 二、单链表的基本操作算法(C语言) 1、宏定义 2、创建结构体 3、初始化 4、插入 4、求长度 5、清空 6、销毁 7、取值 8、查找 9、删除 10、头插法创建单链表…

Centos使用Docker搭建自己的Gitlab(社区版和设置汉化、修改密码、设置SSH秘钥、添加拉取命令端口号)

根据我的经验 部署Gitlab(社区版) 至少需要2核4g的服务器 带宽3~4M 1. 在自己电脑上安装终端:宝塔ssl终端 或者 FinalShell,根据喜好安装即可 http://www.hostbuf.com/t/988.html http://www.hostbuf.com/downloads/finalshell_w…

xshell配置隧道转移规则

钢铁知识库,一个学习python爬虫、数据分析的知识库。人生苦短,快用python。 xshell是什么 通俗点说就是一款强大ssh远程软件,可以方便运维人员对服务器进行管理操作,功能很多朋友们自行探索,今天只聊其中一个功能点那…

中仕教育:研究生毕业可以考选调生吗?

选调生的报考条件之一是应届生,研究生毕业也属于应届生,所以是可以报考的。 选调生不同学历的年龄限制: 1.应届本科生:年龄在25岁以内 2.应届研究生:年龄在30岁以内 3.应届博士生:年龄在35岁以内 研究…

如何为不同品牌的笔记本电脑设置充电限制,这里提供详细步骤

笔记本电脑的电池健康状况至关重要。延长电池寿命可以帮你省下不少钱。对于长时间充电的Windows 11笔记本电脑用户来说,将电池电量限制在80%是很重要的。 虽然操作系统没有提供设置自定义电池充电限制的内置方法,但仍有一些方法可以在Windows 11中配置电池设置,并将其限制在…

kafka(一)——简介

简介 Kafka 是一种分布式、支持分区、多副本的消息中间件,支持发布-订阅模式,多用于实时处理大量数据缓存的场景,类似于一个“缓存池”。 架构 Producer:消息生产者;Consumer:消息消费者;Brok…

6. Spring Boot的starters

6. Spring Boot的starters(重要) 一般认为,SpringBoot 微框架从两个主要层面影响 Spring 社区的开发者们: 基于 Spring 框架的“约定优先于配置(COC)”理念以及最佳实践之路。提供了针对日常企业应用研发各种场景的 spring-boot…