什么是链接?(动态链接库和静态链接库的对比)

news2024/11/19 13:25:40

什么是链接?

首先我们需要知道,一个源文件(以.c为例)是经过什么最后形成的一个可执行的文件(windows下为.exe文件)。

一个.c的源文件,要经历

1.预处理:头文件的展开替换

2.编译:将对应的语言转换成为汇编语言

3.汇编:通过汇编指令形成一个可重命名的二进制文件

4.链接:静态链接和动态链接(下面要谈的内容)

这四个步骤才能最终的形成一个可执行的文件。

我们接下来的目的就是要具体的谈一谈链接的过程。如果你对上面的三个步骤还没有一定的了解的话,建议先去学习一下相关的知识。

一个源文件通过汇编之后形成的二进制文件,如果不进行链接的话,最终还是无法被执行的。

而链接的方式分为静态链接和动态链接两种方式。

在静态链接时使用的库我们称之为静态链接库,在动态链接时使用的库我们称之为动态链接库。

这时引出一个新的问题什么是库?

库的含义其实很好理解,比如我们在学习c/c++时,都会使用到各种的标准库,即当一个函数或类大量的被重复使用时,我们可以将这些具有某种功能的大量被重复使用的函数或类封装在一起,形成一个库文件,简称“

我们在一个项目中,使用到的函数或者类等可能会出现在其他的源文件中(比如我们常常将函数的定义单独的写在对应的源文件中),那么编译器在链接时就会有两种链接的方式。

  • 静态链接:无论是在缺失在标准库还是自己的目标文件中的函数(实际上是以地址的形式进行查询)链接器都会找到他们的地址链接,最终形成一个可执行文件,这个文件可以独立的载入内存中运行!
  • 动态链接:链接器将现在项目中的其它文件中寻找部分缺失的地址,形成一个可执行文件,但是这个可执行的文件中任然是缺失部分的地址,此时将可执行文件载入内存中运行时,链接器才会链接上另一部分缺失的地址。

第一种方式形成的可执行文件虽然可以独立的在内存中运行,

  1. 但是可执行文件内部拷贝了缺失的目标文件和静态链接库的指令和数据,文件本身的体积会很大。
  2. 当系统中存在多个链接同一个静态库的可执行文件时,每个可执行文件中都存有一份静态库的指令和数据,就会造成内存空间的极大浪费。

我们可以在linux下更好的观察这一现象( linux下默认的是采用动态链接的方式)

首先我创建了一个holle.c的文件 ,并且通过gcc -o holle holle.c形成了一个可执行文件holle

我们通过file holle可以观察到这是一个采用动态链接的方式形成的

那么接下来我再通过相关的指令采用静态链接的方式,形成一个新的可执行文件hollestatic

 接下来我们可以进一步的观察一下两个文件的大小

 大家可以看到静态链接形成的文件比动态链接形成的文件要多出很多倍,如果你有多个程序的话,浪费的内存就会更大!!

所以我们通过的编译器采用的都是动态链接的方式,虽然动态链接相比静态链接在性能上有所下将(下将的幅度很小),我们还是愿意采用这种以极小的时间换取大量的空间的方式。

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

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

相关文章

skywalking解析-如何在idea中调试skywalking agent

当我从github上下载下来skywalking agent的代码后,面临的第一个问题就是如何调试。因为skywalking agent的运行模式与普通程序运行方式不一样,它是通过java agent方式运行的。本文接下来介绍如何在本地调试skywalking agent源码。 目录一、下载源码二、运…

leetcode_栈与队列

栈与队列栈与队列理论基础232.用栈实现队列225.用队列实现栈20.有效的括号1047.删除字符串中的所有相邻重复项150.逆波兰表达式求值239.滑动窗口最大值347.前k个高频元素栈与队列总结栈与队列理论基础 栈与队列理论基础 232.用栈实现队列 力扣题目链接 class MyQueue { pub…

Cadence PCB仿真使用Allegro PCB SI通过导入工艺文件配置层叠结构的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI通过导入工艺文件配置层叠结构的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则…

【JavaScript】数组常用方法

冲突数组常用方法: 注: 以下方法都会对原数组进行改变: push:向数组后面追加元素,返回值是追加后的数组长度 pop:从数组后面删除元素,返回值是删除的元素内容 unshift:在数组前面添加元素&am…

CMMI之系统设计

系统设计(System Design, SD)是指设计软件系统的体系结构、用户界面、数据库、模块等,从而在需求与代码之间建立桥梁,指导开发人员去实现能满足用户需求的软件产品。系统设计过程域是SPP模型的重要组成部分。本规范阐述了系统设计…

第一章 Flink简介

Flink 系列教程传送门 第一章 Flink 简介 第二章 Flink 环境部署 第三章 Flink DataStream API 第四章 Flink 窗口和水位线 第五章 Flink Table API&SQL 第六章 新闻热搜实时分析系统 前言 流计算产品实时性有两个非常重要的实时性设计因素,一个是待计算…

文档智能(一):基于OpenCV的文档图像校正

文档智能(一):基于OpenCV的文档图像校正 发表时间: 2023年1月7日创作地点:湖北省武汉市作者:ixy_com&[Aneerban Chakraborty]封面图片来源:DocTr 本文关键词:文档智能、文档图像校正、OpenCV、形态…

从零实现Dooring低代码印章组件

上一篇文章和大家分享了低代码平台组件间通信方案的几种实现:低代码平台组件间通信方案复盘今天继续和大家分享一下比较有意思的可视化印章组件的实现.你将收获低代码组件的基本设计模式印章组件的设计原理(canvas相关)如何快速将任意组件集成到低代码平台正文低代码组件的基本…

雷鸟X2:开启可量产全彩MicroLED光波导AR眼镜新起点

从最近的AR眼镜新品来看,采用MicroLED光波导方案已经成为了明显的趋势,可见业内对于光学的大方向还是非常统一的。不仅如此,各个厂商都拿出自己最优的方案来进行探索和验证,比如有的看重“极轻”、有的看重“视觉”、有的看重“价…

使用Jenkins一键打包部署 SpringBoot应用

一般而言,一个项目部署的由:拉取代码->构建->测试->打包->部署等过程组成,如果我们经常需要部署项目,特别是在微服务时代,服务特别多的情况下,不停的测试打包部署,那估计得有个人一…

数学:一夜读罢头飞雪

文章目录引子代数,几何与分析数学之美微积分形式的统一之美伽罗华群论的深刻之美几何的形体之美公理与定理集合论的公理欧几里得几何公理算术公理实数系的公理系统数学攀登的路径数学的符号系统希腊字母表物理与数学推荐的数学读物参考链接引子 贺新郎读史 人猿相揖…

【阶段二】Python数据分析数据可视化工具使用05篇:统计直方图、面积图与箱型图

本篇的思维导图: 统计直方图 统计直方图(histogram)形状类似柱形图,却有着与柱形图完全不同的含义。统计直方图涉及统计学的概念,首先要从数据中找出它的最大值和最小值,然后确定一个区间,使其包含全部测量数据,将区间分成若干个小区间,统计测量结果出现在各…

详细讲解Linux PCI驱动框架分析

说明: Kernel版本:4.14 ARM64处理器 使用工具:Source Insight 3.5, Visio 1. 概述 从本文开始,将会针对PCIe专题来展开,涉及的内容包括: PCI/PCIe总线硬件; Linux PCI驱动核心框…

通俗理解Platt scaling/Platt缩放/普拉特缩放

一、引言 最近在读论文的时候接触到Platt scaling,有点不理解这个概念。然后好奇心比较重,就看了一些科普,并追根溯源调查了一下Platt scaling。最终搞懂了这个概念,写个博客记录一下。中文翻译有看到:普拉特缩放&…

通信原理与MATLAB(十一):QAM的调制解调

目录1.QAM的调制原理2.QAM的解调原理3.QAM代码4.结果图5.特点1.QAM的调制原理 QAM调制原理如下图所示,基带码元波形经过串并转换分成I、Q两路,然后再经过电平转换(00转换成-1,01转换成-3,10转换成1,11转换成3),再与对应的载波相乘&#xff0…

scMDC:针对单细胞多模态数据进行聚类

目录摘要引言背景介绍单细胞数据聚类方法回顾ZINBscMDC摘要 单细胞多模态测序技术的发展是为了在同一细胞中同时分析不同模态的数据,它为在单细胞水平上联合分析多模态数据从而识别不同细胞类型提供了一个独特的机会。正确的聚类结果对于下游复杂生物功能研究至关重…

JavaEE多线程-认识多线程

目录一、认识操作系统二、认识进程三、内存管理四、什么是线程(Thread)?五、为什么要有线程?六、进程和线程的关系一、认识操作系统 我们需要简单了解一下操作系统。 操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织…

【Python】sklearn机器学习之DBSCAN聚类

文章目录基本原理测试构造函数基本原理 DBSCAN算法是比较经典的聚类算法了,除了sklearn之外,open3d这种常用的点云模块也提供了DBSCAN算法的实现,例如Open3d数据滤波和点云分割。 和其他聚类算法相比,DBSCAN存在一种去中心化的特…

六、Gtk4-Widgets (3)

1 Open 信号 1.1 G_APPLICATION_HANDLES_OPEN flag 在上一节中,我们使用GtkTextView、GtkTextBuffer和GtkScrolledWindow创建了一个非常简单的编辑器。我们将为程序添加文件读取功能,并将其改进为文件查看器。 要给出文件名,最简单的方法是…

(软考)系统架构师大纲

考试要求: 掌握计算机硬软件与网络的基础知识;熟悉信息系统开发过程;理解信息系统开发标准、常用信息技术标准;熟悉主流的中间件和应用服务器平台;掌握软件系统建模、系统架构设计基本技术;熟练掌握信息安全技术、安全策略、安全管理知识;了解信息化、信息技术有关…