链接库是什么

所谓链接库,从字面上理解,指的是程序在“链接”阶段使用的代码库。

“链接”是源程序转换成可执行程序必须经历的步骤之一,考虑到一些初学者对程序的运行过程还不了解,接下来先解释一下“链接”的含义,再系统地讲解链接库。

链接

很多编程语言写出的源代码,必须经过「编译」和「链接」这两个步骤,才能转换成可执行的程序,比如 C语言、C++、C# 等。

将源代码转换成计算机能够识别的二进制程序,这个过程叫做编译。

读者可以把编译理解成“翻译”,类似将中文翻译成英文、将英文翻译成象形文字。 编译是一个复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成二进制代码五个步骤,期间涉及到复杂的算法和硬件架构,感兴趣的读者请自行阅读《编译原理》一书,这里我们不再展开讲解。

编译源代码后生成的文件叫做目标文件(Object File),例如 Visual Studio 下的.obj,或者 GCC 下的.o,它们都是目标文件。注意,目标文件里存储的二进制代码还不完整,不能直接运行。

实际开发中软件的规模往往都很大,动辄数百万行代码,为了方便阅读和维护,程序员会把它们分散到多个文件里。每个文件存储的都是源代码片段,编译它们会生成多个目标文件,这些文件中存储的都是二进制代码片段,每个都不完整,所以不能直接运行。

即便将所有的源代码写在一个源文件里,编译生成一个目标文件,文件中的二进制代码还是不能运行,因为缺少运行所需要的系统组件(比如标准库、链接库等)。

所有目标文件里的二进制代码,以及运行所需要的系统组件(比如标准库、链接库等),把它们组合到一起的过程就叫做链接。链接完成后会生成一个可执行文件,里边存储的就是可执行程序。

你看,程序的链接阶段确实会用到链接库。

关于编译和链接的具体细节,不再深入讲解,感兴趣的读者可以阅读《编译和链接》模块。

链接库

链接库是库的一种,它存放的不是源代码,而是编译后生成的二进制代码。

链接库自己是没法运行的,必须等待别的程序在链接阶段调用它,然后它们一起组合成可执行程序。这样当可执行程序运行时,链接库的程序就能运行了。

链接库的组合方式有两种,分别是:

  1. 直接把链接库中的代码和数据拷贝一份,添加到可执行文件中。最终生成的可执行程序,包含要运行的所有代码,能够脱离链接库独自运行,这样的组合方法叫做静态链接;
  2. 先把所有目标文件组合成一个可执行文件,文件中缺少链接库的代码和数据,不能脱离链接库独立运行。换句话说,程序运行时必须和链接库一起载入到内存中,然后它们在内存中组合成完整的代码,才能正常运行,这样的组合方法叫做动态链接。


也就是说,静态链接是程序载入内存之前完成的,而动态链接是将链接的时机推迟到程序载入内存之后完成。采用静态链接方式的库叫做静态链接库,采用动态链接方式的库叫做动态链接库。

动态链接库是 Windows 平台的叫法,Linux 平台上习惯叫做共享库或者共享对象文件,它们表达的是一个意思。

静态链接库

调用静态链接库生成的可执行程序,程序中包含链接库所有的代码和数据,所以它可以脱离链接库独自运行。

在 Windows 环境中,静态链接库的后缀名通常是.lib;在 Linux 环境中,静态链接库的后缀名通常是.a

调用静态链接库有很多好处,比如可执行程序能够在没有链接库的环境中运行,程序移植到其它的系统环境时不需要额外安装和配置链接库,链接库版本发生变化也不会对程序造成影响等。

静态链接库也存在一些弊端,比如:

  • 由于链接库的代码和数据复制到了可执行文件中,当程序功能较为复杂的时候,整个文件的体积会非常大,加载到内存中的时间就会比较长,最直接的一个例子就是双击打开一个软件,要很久才能看到界面,非常影响用户体验;
  • 当静态链接库需要更新时,所有调用此链接库的可执行程序都需要重新编译和链接,大大增加了维护的工作量;
  • 对于运行着的多个程序,如果它们调用的是同一个静态链接库,那么链接库的代码和数据在内存中就会出现很多份,造成了内存资源的浪费。


实际场景中,如果强调程序能够脱离链接库独自运行,避免不同的系统环境影响程序的正常运行,那么静态链接库是不错的选择;反之,如果链接库需要频繁更新、或者强调对内存资源的高效利用,静态链接库就不适合了。

动态链接库

调用动态链接库生成的可执行程序,程序中不包含链接库的代码和数据,所以程序无法脱离链接库独自运行。换句话说,程序要想执行,必须连同动态链接库一起载入到内存中。

在 Windows 环境下,动态链接库的后缀名通常是.dll;在 Linux 环境下,动态链接库的后缀名通常是.so

动态链接库载入内存的方式有两种,分别是:

  • 隐式加载:又叫载入时加载,指的是可执行程序载入内存时搜索动态链接库,并将链接库的代码和数据载入内存;
  • 显式加载:又叫运行时加载,指的是可执行程序在运行过程中,需要动态链接库里的代码和数据时再加载。


隐式加载也会有静态链接库的问题,如果程序稍大,加载时间就会过长,用户不能接受。显式加载则不存在这个问题,它是将较大的程序分开加载的,程序运行时只需要将可执行程序载入内存,后续需要再载入动态链接库,软件打开速度快,用户体验好。

关于隐式加载和显式加载动态链接库的具体实现,后续章节会做详细地讲解。

和静态链接库相比,动态链接库可以很好地解决空间浪费和更新困难的问题。

动态链接库和可执行文件是分开载入内存的,当有多个程序调用同一个动态链接库时,所有程序共享一份动态链接库的代码和数据,有效避免了内存资源的浪费。

当可执行程序调用的动态链接库需要更新或者升级时,直接用新的库文件把旧的替换掉,程序运行时会自动载入新的动态链接库。

有读者可能会问,采用动态链接的方式,程序每次运行都需要重新链接,会不会很慢?的确,动态链接确实会损失一部分程序性能,但实践证明,动态链接库和静态链接相比,性能损失大约在 5% 以下,由此换取程序在空间上的节省以及更新时的便利,是相当值得的。

总结

链接库指的就是程序在链接阶段使用的代码库。

程序载入内存之前完成链接工作的,称为静态链接库;程序载入内存以后完成链接工作的,称为动态链接库。

静态链接库和动态链接库各有优缺点,要根据实际的项目需求和约束条件选择合适的链接方式。

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

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

相关文章

09磁盘管理

一、磁盘管理 1.磁盘基础知识 (1)磁盘接口类型 个人电脑, 硬盘接口分为IDE类型和SATA类型 服务器版分为SCSI类型和SAS类型 (2)磁盘命名方式 windows中硬盘命名方式是c,d,e盘 linux中硬盘命名方式为 系统…

HTML+CSS+JS 实现3D风吹草动效果(B站视频)

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>3D effect&…

开发指南043-自定义注解

现代Java编程大量使用注解&#xff0c;可以很方便的简化编程&#xff0c;提高编程效率。作为一个平台&#xff0c;也定义了自己的注解。过程如下&#xff1a; 第一步新建java文件&#xff0c;非常类似接口类&#xff1a; import java.lang.annotation.*; public interface …

[迫真保姆级教程]在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上

目录 前言 阅前提示 导言 使用基于vcpkg的&#xff0c;于msvc19编译器编译的Tessereact OCR动态库 使用vcpkg辅助我们的编译 正文 使用msys2环境下的&#xff0c;使用mingw64编译器编译的Tessereact OCR动态库 什么是msys2 安装前&#xff0c;我们也许。。。 [Option]…

网络钓鱼中的高级同形异义:网络安全的新威胁

网络安全正面临一个潜在的新威胁&#xff1a;在网络钓鱼攻击中使用同形异义词。 这篇调查文章探讨了同形异义现象如何在各种类型的网络钓鱼攻击中使用、其背后的技术。 对这种恶意行为的研究以及高级语言模型 (LLM) 如何帮助加速同形异形现象的研究。 什么是同形异义&#xf…

dxf数据结构

DXF&#xff08;Drawing Exchange Format&#xff0c;绘图交换格式&#xff09;是Autodesk公司开发的一种CAD&#xff08;计算机辅助设计&#xff09;文件格式&#xff0c;用于实现AutoCAD与其他软件之间的CAD数据交换。DXF格式文件是一种开放的矢量数据格式&#xff0c;具有多…

怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~

怎么办&#xff1f;我的C盘又爆红了&#xff01;别慌&#xff01;博主手把手带你管理你的C盘空间~ 文章目录 怎么办&#xff1f;我的C盘又爆红了&#xff01;别慌&#xff01;博主手把手带你管理你的C盘空间~0. 在开始清理之前1. 推荐执行的操作1.1 清理系统缓存文件1.2 磁盘清…

MySQL和Redis更新一致性问题

1. 先更新数据库&#xff0c;再更新缓存 适用场景&#xff1a;适用于对数据一致性要求不是特别高&#xff0c;且缓存更新失败对 系统影响较小的场景。例如&#xff0c;某些非关键数据的缓存更新。 风险&#xff1a;如果缓存更新失败&#xff0c;会导致数据库和缓存数据不一致。…

[RK3566-Android11] 使用iPhone14/15出现的蓝牙断开重连无声音问题

问题描述 RK3566使用的RTL8822CS模块&#xff0c;打了a2dpsink 蓝牙音响补丁&#xff0c;蓝牙用作播放歌曲和歌词显示。 测试发现使用Iphone14/15在开机之后10分钟内连接播放再断开&#xff0c;连接播放再断开&#xff0c;重复三四次&#xff0c;蓝牙就会无声音。使用iphone11…

淘宝详情数据获取的 API 之旅:突破与创新

在电商世界的广袤星空中&#xff0c;淘宝犹如一颗璀璨的巨星&#xff0c;其商品详情数据宛如神秘的宝藏&#xff0c;吸引着无数探索者。而 API 接口&#xff0c;则是我们开启这宝藏之门的神奇钥匙。 一、淘宝详情数据&#xff1a;商业洞察的密码 淘宝的商品详情数据&#xff0…

实战精选 | 如何在一台 Linux AI PC 上高效运行 OpenVINO™

点击蓝字 关注我们 作者&#xff1a;Adrian Boguszewski&#xff0c;英特尔 AI 软件布道师 武卓博士&#xff0c;英特尔 AI 软件布道师 什么是 AI PC&#xff0c;为什么它有一个特殊的名字&#xff1f; AI PC 是时下 PC 领域的一个热门话题。与普通 PC 不同&#xff0c;AI PC 配…

AI绘画Stable Diffusion超现实风格电商场景,五个电商专用LoRA分享,制作电商场景变现教程!

前言 本次教程将使用AI绘画工具 Stable Diffusion 进行讲解&#xff0c;如还未安装SD的小伙伴可以看我往期入门教程2024最新超强AI绘画Stable Diffusion整合包安装教程&#xff0c;一键教你本地部署&#xff01;&#xff0c;安装包请扫描免费获取哦https://blog.csdn.net/z199…

如何利用python进行统计显著性检验

在统计学中,显著性差异检验是用来决定两组或多组数据之间是否存在统计学上的差异。若存在显著性差异,则说明数据集之间不是来自于同一个分布。在Python中,可以使用多种方法来进行显著性差异检验,如t检验、KS检验、Wilcoxon符号秩检验等。下面将详细介绍如何使用Python来判断…

初阶数据结构(顺序表的实现)

1. 线性表 线性表是&#xff08;linear list&#xff09;n个具有相同特性的数据元素的有限队列。线性表是一种在实际广泛应用的的数据结构&#xff0c;常见的线性表&#xff1a;顺序表&#xff0c;链表&#xff0c;栈&#xff0c;队列&#xff0c;字符串。。。 线性表在逻辑结…

招采全流程电子化优势及重要功能环节(数智化招采系统)

招投标全流程电子化&#xff0c;是加速招标采购领域数字化转型、创新招标采购交易机制的重要举措。它在构建高效规范、公平竞争、充分开放的大市场环境中起着至关重要的作用。 招采电子化历史沿革 2013年2月&#xff0c;国家发展改革委等八部门发布了《电子招标投标办法》&am…

【git命令大全】

一个练习git命令的平台&#xff1a;Learn Git Branching 1. git status -s --查看仓库状态 2. git add 文件名 --添加需要提交的文件名&#xff08;加路径--参考git status 打印出来的文件路径&#xff09; 3. git stash -u -k --忽略其他文件&#xff0c;把现修改的隐藏…

python杨辉三角的两种书写方式

第一种&#xff08;设置二维列表设置每个元素为0进行替换元素&#xff09; 代码演示&#xff1a; n eval(input("请输入想要的行数")) lst[[0 for j in range(n)] for i in range(n)] # lst2[[0]*n]*n for i in range(n):for j in range(i1):if j0 or ji:lst[i][j…

七款好用的电脑监控软件推荐|电脑屏幕监控软件最新整理!

电脑监控软件在家庭和企业环境中变得越来越重要。它们帮助父母监督孩子的在线活动&#xff0c;也帮助企业确保员工在工作时间内的生产力和数据安全。以下是七款优秀的电脑监控软件推荐&#xff0c;希望能帮助您选择。 固信软件https://www.gooxion.com/ 固信软件 固信软件提供…

极狐GitLab 17.0 重磅发布,100+ DevSecOps功能更新来啦~【七】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

数据库中的数据视图(View):深入理解与应用

引言 编程梦想家&#xff08;大学生版&#xff09;-CSDN博客 在数据库管理中&#xff0c;数据视图&#xff08;View&#xff09;是一个非常重要的概念&#xff0c;它提供了一种虚拟的表结构&#xff0c;其内容由查询定义。数据视图对于简化复杂查询、增强数据安全性以及逻辑数…