初步简单的理解什么是库,什么是静态库,什么是动态库
库是什么
库根据名字我们应该很容易理解,在我们日常生活种,包含库的东西有很多,像仓库,库房那些,库是拿来存放,方便管理东西的,在我们编程当中,库的定义也是如此
那么为什么要有库呢
假设我们要写一个非常简单的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的文件有点类似于压缩包
这就是从技术层面去简单理解一下库
完。
相关文章:
初步简单的理解什么是库,什么是静态库,什么是动态库
库是什么 库根据名字我们应该很容易理解,在我们日常生活种,包含库的东西有很多,像仓库,库房那些,库是拿来存放,方便管理东西的,在我们编程当中,库的定义也是如此 那么为什么要有库…...
从ctfwiki开始的pwn之旅 3.ret2syscall
ret2syscall 原理 ret2syscall,即控制程序执行系统调用,获取 shell。 那么ret2text——程序中有system("/bin/sh")代码段,控制流执行 那么ret2shellcode——程序中不存在system("/bin/sh/")的代码段,自己…...
使用 httputils + protostuff 实现高性能 rpc
1、先讲讲 protostuf protostuf 一直是高性能序列化的代表之一。但是用起来,可难受了,你得先申明 protostuf 配置文件,并且要把这个配置文件转成类。所以必然要学习新语法、新工具。 可能真的太难受了!于是乎,&#…...
系统思考—战略共识
最近与和一位企业创始人深度交流时,他告诉我:“虽然公司在制定战略时总是非常明确,但在执行过程中,经常发现不同层级对战略的理解偏差,甚至部分团队的执行效果与预期大相径庭。每次开会讨论时,大家都说得头…...
Java版-速通数据结构-树基础知识
现在面试问mysql,红黑树好像都是必备问题了。动不动就让手写红黑树或者简单介绍下红黑树。然而,我们如果直接去看红黑树,可能会一下子蒙了。在看红黑树之前,需要先了解下树的基础知识,从简单到复杂,看看红黑树是在什么…...
详尽的oracle sql函数
1,CHR 输入整数,返回对应字符。 用法:select chr(65),chr(78) from dual; 2,ASCII 输入字符,返回对应ASCII码。 用法:select ascii(A),ascii(B) from dual; 3,CONCAT 输入两个字符串,…...
SAP IDOC Error VG205
今天在做IDOC 入栈处理销售订单的时候,一直报错VG205 There is no article description for item 000030 这个问题在通过WE19 前台显示的时候就不会遇见, 只有在接口传输的时候才会遇到 搜索发现,可以通过配置忽略此消息号 配置路径如下…...
DSP 的 CV 算子调用
01 前言 DSP 是 征程 5 上的数字信号处理器,专用于处理视觉、图像等信息。在 OE 包的 ddk/samples/vdsp_rpc_sample 路径下,提供了 DSP 使用示例,包括 nn 和 CV 两部分。 nn 示例涵盖了深度学习模型的相关算子,包括量化、反量化、…...
WMI攻击-基础篇(一)
#WMI攻击-基础篇(一) 这篇文章是关于WMI攻击系列文章的第一部分,面向新手。如果对Powershell有一定了解会对阅读本文有所帮助,但这并不是必需的,我们直接上干货。 #1、概述 为什么是WMI? WMI 是 Microso…...
使用Pygame创建一个简单的消消乐游戏
消消乐游戏是一种经典的益智游戏,玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块,从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。 准备工作 在开始之前,请确保已安装Pygame库。可以通过以下命…...
证明直纹面是可展曲面沿着直母线,曲面的切平面不变
目录 证明直纹面是可展曲面的当且仅当沿着直母线,曲面的切平面不变 证明直纹面是可展曲面的当且仅当沿着直母线,曲面的切平面不变 直纹面是可展曲面当且仅当沿着直母线,曲面的切平面不变. 证明:设直纹面 S S S的参数式为 r ( u …...
Chrome控制台 网站性能优化指标一览
打开chrome-》f12/右键查看元素-》NetWrok/网络 ctrlF5 刷新网页,可以看到从输入url到页面资源请求并加载网页,用于查看资源加载,接口请求,评估网页、网站性能等,如下图: request、stransferred、resour…...
Typora创建markdwon文件的基础语法
标题的创建 使用#空格xxx 可使xxx为标题,同时第一标题为#空格标题;第二标题为##空格标题2。以此类推最多可创建六个标题。 同时按住Ctrl1可创建第一标题,同时按住Ctrl2可创建第二标题,以此类推,最多可创建六个标题。也…...
《嵌入式硬件设计》
一、引言 嵌入式系统在现代科技中占据着至关重要的地位,广泛应用于消费电子、工业控制、汽车电子、医疗设备等众多领域。嵌入式硬件设计作为嵌入式系统开发的基础,直接决定了系统的性能、可靠性和成本。本文将深入探讨嵌入式硬件设计的各个方面ÿ…...
【AIGC】大模型面试高频考点-位置编码篇
【AIGC】大模型面试高频考点-位置编码篇 (一)手撕 绝对位置编码 算法(二)手撕 可学习位置编码 算法(三)手撕 相对位置编码 算法(四)手撕 Rope 算法(旋转位置编码…...
如何使用 SQL 语句创建一个 MySQL 数据库的表,以及对应的 XML 文件和 Mapper 文件
文章目录 1、SQL 脚本语句2、XML 文件3、Mapper 文件4、启动 ServiceInit 文件5、DataService 文件6、ComplianceDBConfig 配置文件 这个方式通常是放在项目代码中,使用配置在项目的启动时创建表格,SQL 语句放到一个 XML 文件中。在Spring 项目启动时&am…...
Unity性能优化---动态网格组合(二)
在上一篇中,组合的是同一个材质球的网格,如果其中有不一样的材质球会发生什么?如下图: 将场景中的一个物体替换为不同的材质球 运行之后,就变成了相同的材质。 要实现组合不同材质的网格步骤如下: 在父物体…...
JVM学习《垃圾回收算法和垃圾回收器》
目录 1.垃圾回收算法 1.1 标记-清除算法 1.2 复制算法 1.3 标记-整理算法 1.4 分代收集算法 2.垃圾回收器 2.1 熟悉一下垃圾回收的一些名词 2.2 垃圾回收器有哪些? 2.3 Serial收集器 2.4 Parallel Scavenge收集器 2.5 ParNew收集器 2.6 CMS收集器 1.垃圾…...
GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
什么是TCP的三次握手
TCP(传输控制协议)的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据,并且初始化双方的序列号。以下是三次握手的详细步骤: 第一次握手(SYN)&…...
Fansly下载器完整指南:3分钟掌握免费离线下载技巧
Fansly下载器完整指南:3分钟掌握免费离线下载技巧 【免费下载链接】fansly-downloader Easy to use fansly.com content downloading tool. Written in python, but ships as a standalone Executable App for Windows too. Enjoy your Fansly content offline anyt…...
Windows右键菜单终极清理指南:3分钟打造高效工作环境
Windows右键菜单终极清理指南:3分钟打造高效工作环境 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是不是也曾对着电脑右键菜单里密密麻麻的选项…...
Node.js 流处理:高效处理大数据的艺术
Node.js 流处理:高效处理大数据的艺术 什么是流? 在 Node.js 中,流(Stream)是处理大量数据的抽象接口。它允许我们逐块读取或写入数据,而不需要一次性将全部数据加载到内存中。 为什么需要流? 想…...
智慧树自动刷课插件终极指南:5分钟快速上手,告别手动刷课烦恼
智慧树自动刷课插件终极指南:5分钟快速上手,告别手动刷课烦恼 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的视频操作而…...
云原生安全新思路:基于DPU智能网卡的IPsec卸载实战,为K8s节点通信加密‘减负’
云原生安全新思路:基于DPU智能网卡的IPsec卸载实战 在Kubernetes集群中,节点间的网络通信安全一直是DevOps团队关注的焦点。传统IPsec加密方案虽然能有效保护数据传输,却不可避免地消耗大量主机CPU资源。当集群规模扩大时,这种加密…...
手把手教你用STM32CubeMX配置STM32F103的Modbus从站(FreeMODBUS移植指南)
基于STM32CubeMX与FreeMODBUS的工业通信从站开发实战 在工业自动化领域,Modbus协议因其简单可靠的特点,至今仍是设备间通信的黄金标准。对于STM32开发者而言,传统的外设库直接编程方式需要处理大量底层细节,而CubeMX工具链与成熟开…...
产品工程师(Product Engineer)角色为何在创业公司成为最稀缺的竞争力?
在科技招聘市场,一位能力顶尖的工程师投递了上百份简历,却始终卡在“技术面试过关、产品讨论却露怯”的阶段。团队明明需要能快速交付价值的人,可最终录用的往往是那些“既懂代码又能自己做产品决策”的少数派。大多数候选人把精力全放在刷 L…...
从SE到Dual-Attention:手把手教你为YOLOv8或ResNet模型‘加装’注意力模块提升指标
从SE到Dual-Attention:手把手教你为YOLOv8或ResNet模型‘加装’注意力模块提升指标 在计算机视觉领域,注意力机制已成为提升模型性能的"秘密武器"。不同于完全重构网络架构,注意力模块的魅力在于其即插即用的特性——就像为汽车加装…...
普冉PY32F003单片机PWM呼吸灯实战:从8ms定时器中断到10KHz波形平滑调节
普冉PY32F003单片机PWM呼吸灯实战:从8ms定时器中断到10KHz波形平滑调节 在嵌入式开发中,PWM(脉冲宽度调制)技术是实现LED亮度渐变、电机调速等功能的基石。普冉PY32F003作为一款高性价比的32位单片机,其定时器模块的灵…...
56、CAN总线RC低通滤波器截止频率计算与实战
CAN总线RC低通滤波器截止频率计算与实战 一、一个让我熬夜三天的CAN通信故障 去年做某车载ECU项目,CAN总线在电机启动瞬间频繁丢帧。示波器抓波形,CAN_H对地毛刺高达8V,持续时间约200ns。团队里有人提议“加磁珠”,有人喊“上共模扼流圈”。我翻出TI的AN-2298应用笔记,发…...
