初步简单的理解什么是库,什么是静态库,什么是动态库

库是什么

库根据名字我们应该很容易理解,在我们日常生活种,包含库的东西有很多,像仓库,库房那些,库是拿来存放,方便管理东西的,在我们编程当中,库的定义也是如此

那么为什么要有库呢
假设我们要写一个非常简单的C程序,在屏幕上输出hello,world,实现这个功能很简单,我们只需要把头文件一包,代码一写,不到1分钟就可以实现,非常的迅速,这就是利用了标准输入输出库才让我们写代码的效率变得很高效
假设我们没有库,我们要实现这个功能就难多了,我们首先就需要去写一个能够实现在屏幕上输出东西的代码,才能进行我们的下一步,这就非常的麻烦,时间花费就会很大,如果每个程序员都要实现这个功能,那不是每个人都要去写一遍这个代码,而且每个人写的水平参差不齐,就会变得非常的麻烦

那么基于以上的问题不如我们去找一个写这个功能水平很高的人他来去写,我们就去调用他写的就行了,于是就有了库。
假设我们写代码就像修房子,没有库之前什么东西都要我们自己去弄,像水泥,砖头脚手架那些,而且每个人弄的标准质量还不一样,非常的麻烦,有了库之后,库就像一个可以提供高质量的砖头,水泥,脚手架,的一个地方,方便我们去调用他,提高我们建房子的速度。
在编程上的库也是如此,在编程上,库就是一套方法,或者数据集为我们的开发提供质量和保证提供基本接口,功能,加速我们二次开发
由此可见库是多么的重要

有了库的基本概念之后,我们又来看看什么是动态库,静态库

动态库

这里我们可以先写一段简单的代码来帮助我们理解

# include<stdio.h>
int main()
{printf("hello,world");return 0;
}

我们在linux下面用gcc来编译之后,输出可执行文件之后,我们用ldd,ldd 是 Linux 系统中的一个命令,用于打印程序或共享库依赖的共享库列表。这个命令可以显示一个可执行文件或共享库(共享库也叫动态库)需要哪些共享库才能正常运行,以及这些依赖库的路径 命令来查看一下看看我们程序是依赖了哪些动态库
在这里插入图片描述
我们来查看一下testout这个可执行程序运用了哪些动态库
在这里插入图片描述
我们发现这里有关libc.so.6这个库,这个就是C标准库 后面的.so后缀就代表这是一个动态库,如果是.a就是一个静态库在linux下是这样表示的,但在windows动态库是以.dll,结尾的我们看库是什么类型的就只需要把前缀(ldd)和后缀.so去掉就行了,去掉之后就显示一个C标准库
在了解了这个之后我们发现后面跟了一个地址,这个地址不难发现这是一个内存地址,这个内存地址代表了这个动态库在内存的哪个位置
所以我们发现动态库是存放在内存中的

那么我们程序运行的时候,他是怎么知道要跳转到这个库中去找相应的库方法的呢?
我们都知道程序要进行,预处理,编译,汇编,链接 生成可执行程序 这几个步骤
在我们的程序进行到链接这一步时,我们自己的程序调用了相应库里面的库方法,我们只需要把自己的程序和相应的库进行链接起来,让我们的程序能在库中找到相应的方法,这个可能有点抽象,下面这个图片可以更好的说明一下
在这里插入图片描述
我们在代入代码层面去看看
在这里插入图片描述
现在我们对动态库有了一个初步的理解了
在程序运行中时,动态库会加载到内存中,共多个程序调用,所以动态库也叫共享库
在这里插入图片描述

静态库

下面又来说说静态库是什么

静态库和动态库有一个很大的差别就是,静态库是每个程序独享的,动态是共享的
静态库,会在程序运行的时候,直接把库里面的实现方法给拷贝替换过来,而不是跳转地址,所以这样的程序占用空间就会非常大
我们在linux环境下继续来看看
在这里插入图片描述
在这里插入图片描述

第一个testout是调用的是动态库,第二个是静态库,可以很明显的看到静态库的所占空间比动态大得多
但是静态库有个好处就是,能让程序的健壮性更强,因为如果这个程序运行的全是调用的是静态库的话,自己就是一个独立的个体,不需要外界的帮助也能完成程序所要执行的任务。
静态库只用在链接的时候有用,一旦生成可执行程序,就不再需要了
当然在我们大多数的程序中,都是使用的是动态库
我们也可以在Linux下验证一下
就拿常用的指令来看看
我们在usr/bin目录下面随便用ldd看看
在这里插入图片描述
都是调用动态库的
同样在windows下面也是,像很多程序运行都会依赖类似于这些动态库
在这里插入图片描述
现在我们从技术层面上来再次理解一下库
现在我们来具体说明一下
来个例子看看
在这里插入图片描述
我们先创建这些文件
里面放相应的声明和实现
在这里插入图片描述
在编译一下,这样是可以编译的

在这里插入图片描述
假设,我不想让别人知道我的code.c里面实现的内容,就只留一个头文件声明的接口去供使用者调用,不想把源文件暴露给其他人,那该怎么办 我们就可以这样,我们把我们的code.c只编译成目标文件一个.o文件
像这样
在这里插入图片描述
然后再把我的code.c文件给删了
在这里插入图片描述
其他人的main函数里面就只有我的code1.c接口的调用方式,看不到我相关代码的内容
首先要编译main函数形成一个.o文件,然后再把两个.o文件链接成一个可执行程序
同样也能完成编译
在这里插入图片描述
我们上面就给了一个.o文件,假设有很多个.o文件实现不同的功能我们就需要打包了。
这样就有点类似于我们lib64文件夹下面的库文件了
在这里插入图片描述
然后当我们写程序的时候就会包相应掉库方法的头文件
在这里插入图片描述
最终实现我们程序的功能

我们上面的例子就像模拟一个库一样,通过自己的头文件去掉自己的库内容,不暴露源文件,最终实现程序的功能

结合上面的例子,我们可以得出一个结论:库的本质其实就是由一堆的.o文件打包成为的一个.a或是.so的文件有点类似于压缩包
这就是从技术层面去简单理解一下库
完。

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

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

相关文章

建筑行业数据分析如何做?

导读&#xff1a;在谈数字化转型之前&#xff0c;先来谈谈数据的价值。数字化转型的基础是数据&#xff0c;是数字化的基本的生产资料&#xff0c;数据的质量直接决定了数字化的能力、所能达到的深度和广度。目前做的数据可视化项目总感觉只是数据展现而已&#xff0c;而不达不…

服务器监控工具哪吒探针 v1 版本上线 全新设计带来新体验

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 上周黑五期间&#xff0c;哪吒探针进行了一次颇有争议的 Breaking Change 更新&#xff0c;将面板和 Agent 升级到了 v1 版本&#xff0c;并且与原来的 v0.x 版本完全不兼容。 同时&#xff0c;将 v0.x 的…

LabVIEW密码保护与反编译的安全性分析

在LabVIEW中&#xff0c;密码保护是一种常见的源代码保护手段&#xff0c;但其安全性并不高&#xff0c;尤其是在面对专业反编译工具时。理论上&#xff0c;所有软件的反编译都是可能的&#xff0c;尽管反编译不一定恢复完全的源代码&#xff0c;但足以提取程序的核心功能和算法…

灰狼算法与蚁群算法的结合:一种新颖的优化方法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【前端学习路线】(超详细版本)

先附上学习路线图&#xff1a;前端学习路线 第一阶段&#xff1a;前端入门&#xff08;htmlcss&#xff09; 前端最基本的知识&#xff0c;需要先将这些内容融汇贯通&#xff0c;学习后面内容才会不吃力。学习完可以做几个静态页练习一下。 推荐视频学习链接&#xff1a; 黑马程…

四、自然语言处理_03LSTM与GRU

0、前言 随着循环神经网络&#xff08;RNN&#xff09;在各种序列数据处理任务中被广泛应用&#xff0c;研究人员逐渐发现了其在处理长序列数据时会容易出现梯度消失&#xff08;vanishing gradient&#xff09;和梯度爆炸&#xff08;exploding gradient&#xff09;问题&…

nerdctl:与 Docker 兼容的 containerd CLI

nerdctl 是一个用于容器管理的命令行工具&#xff0c;它旨在提供与 Docker CLI 相似的用户体验&#xff0c;但却是为 containerd 这样的低级容器运行时设计的。containerd 是一个行业标准的容器运行时&#xff0c;被广泛用作 Kubernetes 等容器编排平台的一部分。nerdctl 通过简…

百问FB显示开发图像处理 - 图像调整

2.4 图像调整 2.4.1 图像的缩放 2.4.1.1 图像缩放算法浅析 图像缩放算法有很多种&#xff0c;这里参考网友"lantianyu520"所著的"图像缩放算法"。 原理浅析 ​ 要理解这个图像缩放算法的原理&#xff0c;最重要的是需要理解&#xff1a;对于图像上的每…

部署项目报错

vue2项目部署后 Error: Cannot find module /views/*** 1.起因 登录页、首页等静态页面可以正常进入&#xff0c;后端访问也正常&#xff0c;可以获取到验证码。 但是登录之后会发现首页空白或者进入不到首页 F12查看有报错信息&#xff1a;Error: Cannot find module ‘/v…

opencv复习

目录 1.core 1.图像变换 1.1 affine仿射变换 1.2 透视变换 2.四元数&#xff08;旋转&#xff09; 2.1 轴角转四元数 2.2 旋转矩阵转四元数 2.3 欧拉角转旋转矩阵 2.4 四元数转旋转矩阵 2.5 四元数用eigen用的比较多 2. imgproc. Image Processing 2.1 bilateralF…

【webApp之h5端实战】首页评分组件的原生实现

关于评分组件,我们经常在现代前端框架中用到,UI美观效果丰富,使用体验是非常不错的。现在自己动手使用原生js封装下评分组件,可以用在自己的项目中。 组件实现原理 点击的❤左侧包括自己都是高亮的样式,右侧都是灰色的样式,这样就能把组件的状态区分开了。右边再加上辅…

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构&#xff0c;它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试&#xff1f; 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…

【C++】格式化输出详解:掌握 cout 的进阶用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;格式化输出的理论概述&#x1f4af;控制输出宽度和填充字符setw 操作符setfill 操作符 &#x1f4af;控制浮点数的显示格式fixed 与 scientificsetprecision &#x1f4af;…

【日常记录-Mybatis】PageHelper导致语句截断

1. 简介 PageHelper是Mybatis-Plus中的一个插件&#xff0c;主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象&#xff0c;并保存到本地线程ThreadLocal中&#xff0c;接下来&#xff0c;PageHelper会进入Mybatis的拦截器环节&#xff0c;…

Linux入门攻坚——40、Linux集群系统入门-lvs(1)

Cluster&#xff0c;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展&#xff0c;系统扩展的方式&#xff1a;scale up&#xff0c;向上扩展&#xff0c;更换更好的主机&#xff1b;scale out&#xff0c;向外扩展&…

Canal 深入解析:从原理到实践的全面解读

Canal 深入解析&#xff1a;从原理到实践的全面解读 官网&#xff1a;https://github.com/alibaba/canal Canal 是阿里巴巴开源的一款分布式增量数据同步工具&#xff0c;广泛应用于数据同步、实时数据处理和数据库的增量备份等场景。它可以通过监听 MySQL 数据库的 binlog&am…

Home Assistant智能家居盒子用了一段时间发现没有存储空间了,怎么清理释放?

环境&#xff1a; Unbuntu 20.04 Home Assistant 2023.8.0 问题描述&#xff1a; Home Assistant智能家居盒子用了一段时间发现没有存储空间了&#xff0c;怎么清理释放&#xff1f; 解决方案&#xff1a; 1.查看HA日志文件&#xff0c;有比较大&#xff0c;直接删了 2.查…

【NoSQL数据库】MongoDB数据库的安装与卸载

目录 一、MongoDB原理 二、MongoDB的安装和卸载 三、注意事项 一、MongoDB原理 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关…

【Java】2、集合

目录 CollectionListSet *重点&#xff1a; 底层机制&#xff08;源码&#xff09;应用场景 好处&#xff1a; 数组&#xff08;长度不可改&#xff0c;同一类型&#xff0c;增删不便&#xff09;集合&#xff08;动态保存&#xff0c;多种类型&#xff0c;方便操作&#xff09…

【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 ✔️ 11.2.2.…