Linux下的动静态库及链接

news2024/12/23 10:42:20

目录

常识

动态链接

静态链接

两者的比较

动态库与静态库


常识

我们平时写的代码和标准库是两回事,像C标准库提供给我们一些函数方便使用,降低程序员工作成本。比如写个printf("hello world"); 我们只是调用了库里的函数,并没有实现该函数,在链接的过程中,我们的代码和库中的结合起来(调用+实现)才生成可执行程序。

而一般所说的库有两个,动态库和静态库,链接也对应的有动态链接和静态链接。

动态链接

简单来讲就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。也就是说,把链接这个过程推迟到了运行时再进行,这就是动态链接(Dynamic Linking)的基本思想。

空谈理论难以理解,下面我举个例子:

00年网络尚未普及时,张三在学校里想在周末打打游戏,但是宿舍没电脑,于是他问学长附件有没有网吧,学长告诉他一公里外有个网吧。这里相当于编写代码写了句printf("hello world");然后像编译器、链接器询问库的所在,和库建立联系。然后张三跑到网吧上网,这就相当于库函数跳转。

 这种情况就是动态链接。张三需要跑到网吧去上网。

接下来有三个问题:

1、网吧现在装修扩建,会不会影响张三上网?————必然会。同理动态库升级也会影响程序员使用。

2、网吧被拆除会不会影响张三上网?————必然会。一样的动态库删库就无法使用了。

3、跑去一公里外的网吧上网耗费张三时间吗?————耗费。动态库也耗费一定的时间。

静态链接

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。

还是刚刚那个场景。张三觉得每天跑去网吧不方便,就在自己宿舍装了台电脑,这样就能直接上网不需要再每天跑来跑去了。

还是那三个问题:

1、网吧现在装修扩建,会不会影响张三上网?————不会。同理库升级不影响程序员使用。

2、网吧被拆除会不会影响张三上网?————不会。使用静态库的时候,链接过程不是我们写的代码与库产生关联,而是将我们的代码需要的库函数实现拷贝一份拿过来,这样就完成了静态链接,所以库不能用了不影响静态库。

3、现在张三不用跑去网吧,直接在宿舍上网即可。

两者的比较

这么看来静态链接貌似比动态链接方便咯?————实际上Linux下默认的是动态链接的。

它们各有优势,但是动态链接的优势重要性要大得多,或者说静态链接的缺陷是致命的。

从上面的例子来看,动态链接的缺点是库的状态会影响动态链接;优点是动态链接形成的可执行程序小,节约了资源(内存、磁盘、网络)。

静态链接相反,缺点是形成的可执行程序太大;优点是不受库的升级删除影响。

有人会说,现在电脑磁盘存储大小动辄几百G甚至1T,可执行程序大点也无所谓把?

————其实不然!如果我们现在安装的所有软件突然变大了100倍,比如下的10G游戏,变成了1000G,那还怎么运行,尤其是还要加载到内存,届时内存加载2、3个文件就扛不住了。

拿Linux下的动静态链接对比一下文件大小就知道了:

我们写一段小代码

 gcc编译一下,可执行程序a.out 大小是8360byte:

 现在是动态链接(linux下默认动态链接),dynamically意思就是动态地。


现在我们用静态链接方式编译刚才的代码,生成可执行程序mytest


 静态链接,可执行程序大了100倍!这就是为什么默认使用动态链接的原因。

动态库与静态库

 使用ldd命令可以查看动态可执行文件的信息。

libc.so.6就是动态库,并且是C标准库。将前缀lib,后缀so.6去掉,剩下的就是库名。

 ldd 静态库,说:这不是一个动态可执行程序,那么以后该程序就和库无关了。

 再看下指令,也都是动态链接。所以动态库是我们编写代码所需的重要东西,绝不能删除动态库,否则很多命令都执行不了。

用动态库的程序很多,但是库只有一个,所有C语言写的程序,都不会出现重复的库代码。

所以动态库是共享库。以后要下载一个C语言写的程序,不用下载库。

静态链接形式是libXXX.a,也是一样,去掉前缀lib,去掉后缀.a剩下的就是库名。

上面说了静态链接需要拷贝库,那么是拷贝.so中的内容吗? ————不是。

并且系统里必须存在.a结尾的静态库。如果没有,需要自己安装。

C标准库:yum install -y glibc -static

C++标准库:yum install -y libstdc++ -static

总结一下,动态链接找动态库,静态链接找静态库,不能互相找!

 

 

 

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

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

相关文章

字节跳动“技穷”,火山引擎“啃老”

文丨智能相对论作者丨沈浪「云」的赛道正在细化,是显而易见的趋势,诸如汽车云、营销云、视频云、零售云等等,大致可以理解为通过云计算等技术推动特定行业场景实现数字化转型的解决方案。之所以出现这种情况,存在多个层面的原因&a…

Kubernetes部署Postgresql

环境:Postgresql的Docker镜像 ->参考Docker安装部署PostgresqlCentos7.x kubernetes1.23.7 docker1.13.1 postgres12.7pg的docker镜像已经上传到云平台。Kubernetes参考:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap基本命…

Youngter-drive 题解

1.查壳 32bit,加了UPX壳 2.虚拟机脱壳 Youngter-drive脱壳3.静态分析寻找思路 跟进main_0函数 线程控制的知识不懂,去搜一下函数 createMutexW 函数 创建或打开命名或未命名的互斥对象。 HANDLE CreateMutexW( [in, optional] LPSECURITY_ATTRIBUTES lp…

通信原理笔记—部分响应基带传输系统

目录 基本设计思想: 问题的引入与考虑: 第一类部分响应系统: 定义奈奎斯特脉冲: 定义第一类部分响应系统的冲激响应: 第一类部分响应系统冲激响应与频率特性波形图: 第一类部分响应系统信号波形示例: 编码发送与接收解码过程示例: 第…

Biome-BGC生态系统模型与Python融合技术实践应用

查看原文>>> Biome-BGC生态系统模型与Python融合技术实践应用 Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数,模拟日尺度碳、水和氮通量的有效模型,其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中&#xf…

Tomcat 源码启动

要想学习 Tomcat 原理,看源码是最直接的方式,而想要理解源码,我们要想把它在本地跑起来。 下载源码 到 Tomcat 的官网 http://tomcat.apache.org 上下载 Tomcat 的源码 下载下来是一个压缩包文件 解压之后目录结构如下 用IDEA打开 在…

redis集群管理工具HHDBCS

参考地址: HHDBCS下载地址 Redis教程 1 快速介绍 1.1 什么是HHDBCS? HHDBCS是恒辉信达公司推出的通用数据库管理桌面工具,专为简化数据库的管理及数据管理成本而设计,让用户通过统一的桌面视图管理成千上万的异构数据库实例。 它采用了…

【Feign】Spring框架集成Feign

Spring框架集成Feign1、Feign-简介2、spring-cloud快速整合OpenFeign3、Feign日志4、Feign契约配置5、Feign配置超时时间6、Feign拦截器7、Feign断路器1、Feign-简介 Feign是Neflix开发的声明式、模块化的HTTP客户端,集成了Ribbon、RestTemplate实现了负载均衡的执…

快收藏,2023有这些财务分析模板就够了

相信很多的财务人都才刚刚经历一个兵荒马乱的年终,各种核算、整理、分析,工作量直线上升,说不定加班几点半个月都未必能歇一下。但不用担心,在接下来的2023里,可以通过BI财务分析报表模板来高效解决这些问题。 BI软件…

[python][VTK]vtk安装后测试代码

测试vtk版本为9.2.5 import vtk cone_a vtk.vtkConeSource() coneMapper vtk.vtkPolyDataMapper() coneMapper.SetInputConnection(cone_a.GetOutputPort()) coneActor vtk.vtkActor() coneActor.SetMapper(coneMapper) ren1 vtk.vtkRenderer() ren1.AddActor(coneActor…

黑马点评项目要点内容总结【面试用】

小众点评项目要点 文章目录小众点评项目要点1.使用Redis代替Session登录1.1 Session登录存在的问题1.2 使用Redis代替Session登录分析1.3 使用Redis登录的流程1.4 解决Redis中有效期问题2.使用Redis作为缓存2.1 为什么使用缓存2.2 缓存策略2.3 解决缓存穿透2.4 解决缓存雪崩2.5…

熵值法原理及python实现 附指标编制案例

文章目录1.简单理解 信息熵2.编制指标 (学术情景应用)3.python实现3.1 数据准备3.2 数据预处理3.3 熵值、权重计算3.4 编制综合评价指标熵值法也称熵权法,是学术研究,及实际应用中的一种常用且有效的编制指标的方法。1.简单理解 信…

在数组中删除重复数字(详解)

前言:本期是关于删除重复数字的详解,今天你c了吗? 方法: 双指针 以一组数:3 4 1 0 0 2 3 1 1 2 为例删除重复的数字 step 1:排序 使用双下标法的前提是数组有序(降序or升序) 可以使…

MYSQL命令总结

一.库的操作 1.创建库 create database db1;//创建名为db1的数据库 create database db2 charsetutf8;//创建一个utf8字符集的db2数据库 create database db3 charsetutf8 collate utf8_general_ci;//创建一个使用utf字符集并带校对规则的db3数据库2.字符集和校验规则 show …

[redis+springboot]缓存sql执行结果

场景: 访问controller层(其实是service),需要将其结果缓存到redis,下一次直接从缓存找值,从而减少sql操作,减轻数据库压力技术: redis,springboot,jpa,mysql1, 新建项目2, 导入依赖<?xml version"1.0" encoding"UTF-8"?> <project xmlns"h…

懂了委托,才算真正入门C#

文章目录委托的概念多播委托拖动按钮前文提要&#xff1a;超快速成&#xff0c;零基础掌握C#开发中最重要的概念抽丝剥茧&#xff0c;C#面向对象快速上手Winform&#xff0c;最友好的桌面GUI框架 委托的概念 委托这个名字取的神乎其神的&#xff0c;但实质是函数式编程&#…

网络攻防技术--第五次作业

文章目录作业五一、 什么是恶意代码&#xff1f;恶意代码主要类型有哪些&#xff1f;二、 恶意代码的基本技术主要包括哪几种&#xff1f;三、 什么是特洛伊木马&#xff1f;有什么特点&#xff1f;四、 什么是计算机病毒&#xff1f;其有哪几个基本组成部分&#xff1f;五、 什…

项目管理工具能做什么 它给企业带来哪些作用

一个项目经理&#xff0c;如果要想管理好项目&#xff0c;那么一定要掌握项目管理的方法与工具。在项目管理过程中总会借助一些工具来掌控项目点点滴滴&#xff0c;这不仅可以提高团队的生产力和效率&#xff0c;还可以让项目组织在不同项目带来的影响变化中做好准备。 项目管…

每天一道大厂SQL题【Day03】订单量统计

每天一道大厂SQL题【Day03】订单量统计 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&#xff0c…

SAP 自定义SQL编辑器

导语&#xff1a;自定义SQL编辑器&#xff0c;可使用SAP ABAP的OPEN SQL语法进行编辑&#xff0c;快速出具简单报表&#xff0c;基本具备与SAP中DB02相似的功能。 此资源其中有两个版本&#xff0c;一个版本是网上的代码资料&#xff0c;另一个版本是本人优化过后的&#xff0…