当前位置: 首页 > news >正文

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

库是什么

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

那么为什么要有库呢
假设我们要写一个非常简单的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的文件有点类似于压缩包
这就是从技术层面去简单理解一下库
完。

相关文章:

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

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

从ctfwiki开始的pwn之旅 3.ret2syscall

ret2syscall 原理 ret2syscall&#xff0c;即控制程序执行系统调用&#xff0c;获取 shell。 那么ret2text——程序中有system("/bin/sh")代码段&#xff0c;控制流执行 那么ret2shellcode——程序中不存在system("/bin/sh/")的代码段&#xff0c;自己…...

使用 httputils + protostuff 实现高性能 rpc

1、先讲讲 protostuf protostuf 一直是高性能序列化的代表之一。但是用起来&#xff0c;可难受了&#xff0c;你得先申明 protostuf 配置文件&#xff0c;并且要把这个配置文件转成类。所以必然要学习新语法、新工具。 可能真的太难受了&#xff01;于是乎&#xff0c;&#…...

系统思考—战略共识

最近与和一位企业创始人深度交流时&#xff0c;他告诉我&#xff1a;“虽然公司在制定战略时总是非常明确&#xff0c;但在执行过程中&#xff0c;经常发现不同层级对战略的理解偏差&#xff0c;甚至部分团队的执行效果与预期大相径庭。每次开会讨论时&#xff0c;大家都说得头…...

Java版-速通数据结构-树基础知识

现在面试问mysql,红黑树好像都是必备问题了。动不动就让手写红黑树或者简单介绍下红黑树。然而&#xff0c;我们如果直接去看红黑树&#xff0c;可能会一下子蒙了。在看红黑树之前&#xff0c;需要先了解下树的基础知识&#xff0c;从简单到复杂&#xff0c;看看红黑树是在什么…...

详尽的oracle sql函数

1&#xff0c;CHR 输入整数&#xff0c;返回对应字符。 用法&#xff1a;select chr(65),chr(78) from dual; 2&#xff0c;ASCII 输入字符&#xff0c;返回对应ASCII码。 用法&#xff1a;select ascii(A),ascii(B) from dual; 3&#xff0c;CONCAT 输入两个字符串&#xff0c…...

SAP IDOC Error VG205

今天在做IDOC 入栈处理销售订单的时候&#xff0c;一直报错VG205 There is no article description for item 000030 这个问题在通过WE19 前台显示的时候就不会遇见&#xff0c; 只有在接口传输的时候才会遇到 搜索发现&#xff0c;可以通过配置忽略此消息号 配置路径如下…...

DSP 的 CV 算子调用

01 前言 DSP 是 征程 5 上的数字信号处理器&#xff0c;专用于处理视觉、图像等信息。在 OE 包的 ddk/samples/vdsp_rpc_sample 路径下&#xff0c;提供了 DSP 使用示例&#xff0c;包括 nn 和 CV 两部分。 nn 示例涵盖了深度学习模型的相关算子&#xff0c;包括量化、反量化、…...

WMI攻击-基础篇(一)

#WMI攻击-基础篇&#xff08;一&#xff09; 这篇文章是关于WMI攻击系列文章的第一部分&#xff0c;面向新手。如果对Powershell有一定了解会对阅读本文有所帮助&#xff0c;但这并不是必需的&#xff0c;我们直接上干货。 #1、概述 为什么是WMI&#xff1f; WMI 是 Microso…...

使用Pygame创建一个简单的消消乐游戏

消消乐游戏是一种经典的益智游戏&#xff0c;玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块&#xff0c;从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。 准备工作 在开始之前&#xff0c;请确保已安装Pygame库。可以通过以下命…...

证明直纹面是可展曲面沿着直母线,曲面的切平面不变

目录 证明直纹面是可展曲面的当且仅当沿着直母线&#xff0c;曲面的切平面不变 证明直纹面是可展曲面的当且仅当沿着直母线&#xff0c;曲面的切平面不变 直纹面是可展曲面当且仅当沿着直母线&#xff0c;曲面的切平面不变. 证明&#xff1a;设直纹面 S S S的参数式为 r ( u …...

Chrome控制台 网站性能优化指标一览

打开chrome-》f12/右键查看元素-》NetWrok/网络 ctrlF5 刷新网页&#xff0c;可以看到从输入url到页面资源请求并加载网页&#xff0c;用于查看资源加载&#xff0c;接口请求&#xff0c;评估网页、网站性能等&#xff0c;如下图&#xff1a; request、stransferred、resour…...

Typora创建markdwon文件的基础语法

标题的创建 使用#空格xxx 可使xxx为标题&#xff0c;同时第一标题为#空格标题&#xff1b;第二标题为##空格标题2。以此类推最多可创建六个标题。 同时按住Ctrl1可创建第一标题&#xff0c;同时按住Ctrl2可创建第二标题&#xff0c;以此类推&#xff0c;最多可创建六个标题。也…...

《嵌入式硬件设计》

一、引言 嵌入式系统在现代科技中占据着至关重要的地位&#xff0c;广泛应用于消费电子、工业控制、汽车电子、医疗设备等众多领域。嵌入式硬件设计作为嵌入式系统开发的基础&#xff0c;直接决定了系统的性能、可靠性和成本。本文将深入探讨嵌入式硬件设计的各个方面&#xff…...

【AIGC】大模型面试高频考点-位置编码篇

【AIGC】大模型面试高频考点-位置编码篇 &#xff08;一&#xff09;手撕 绝对位置编码 算法&#xff08;二&#xff09;手撕 可学习位置编码 算法&#xff08;三&#xff09;手撕 相对位置编码 算法&#xff08;四&#xff09;手撕 Rope 算法&#xff08;旋转位置编码&#xf…...

如何使用 SQL 语句创建一个 MySQL 数据库的表,以及对应的 XML 文件和 Mapper 文件

文章目录 1、SQL 脚本语句2、XML 文件3、Mapper 文件4、启动 ServiceInit 文件5、DataService 文件6、ComplianceDBConfig 配置文件 这个方式通常是放在项目代码中&#xff0c;使用配置在项目的启动时创建表格&#xff0c;SQL 语句放到一个 XML 文件中。在Spring 项目启动时&am…...

Unity性能优化---动态网格组合(二)

在上一篇中&#xff0c;组合的是同一个材质球的网格&#xff0c;如果其中有不一样的材质球会发生什么&#xff1f;如下图&#xff1a; 将场景中的一个物体替换为不同的材质球 运行之后&#xff0c;就变成了相同的材质。 要实现组合不同材质的网格步骤如下&#xff1a; 在父物体…...

JVM学习《垃圾回收算法和垃圾回收器》

目录 1.垃圾回收算法 1.1 标记-清除算法 1.2 复制算法 1.3 标记-整理算法 1.4 分代收集算法 2.垃圾回收器 2.1 熟悉一下垃圾回收的一些名词 2.2 垃圾回收器有哪些&#xff1f; 2.3 Serial收集器 2.4 Parallel Scavenge收集器 2.5 ParNew收集器 2.6 CMS收集器 1.垃圾…...

GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

什么是TCP的三次握手

TCP&#xff08;传输控制协议&#xff09;的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据&#xff0c;并且初始化双方的序列号。以下是三次握手的详细步骤&#xff1a; 第一次握手&#xff08;SYN&#xff09;&…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...