链接库介绍

2023-10-30

什么是库?

计算机中,有些文件专门用于存储可以重复使用的代码块,例如功能实用的函数或者类,我们通常将它们称为库文件,简称“库”(Library)。 以 C 语言为例,如下展示一个函数库:

//myMath.c
int add(int a, int b) {
    return  a + b;
}
int sub(int a, int b) {
    return  a - b;
}
int mul(int a, int b) {
    return  a * b;
}
int div(int a, int b) {
    if (b != 0) {
        return a / b;
    }
    return -1;
}

myMath.c 文件中包含 4 个函数,它们分别可以完成两个整数的加法、减法、乘法和除法运算。myMath.c 库文件的用法也很简单,直接将它添加到某一个 C 语言项目中,就可以直接调用文件中的 4 个函数,每个函数可以调用多次。

什么是链接库?

如上所述,显然实际开发中引入他人编写好的库文件可以省略某些功能的开发环节,提高项目的开发效率。但遗憾的是,类似 myMath.c 这种“开源”的库文件很难找到,多数程序员并不会直接分享源代码,他们更愿意分享库文件的二进制版本——链接库

所谓链接库,其实就是将开源的库文件(如上面提到的 myMath.c)进行编译、打包操作后得到的二进制文件

虽然链接库是二进制文件,但无法独立运行,必须等待其它程序调用,才会被载入内存

一个完整的 C 语言项目可能包含多个 .c 源文件,项目的运行需要经过“编译”和“链接”两个过程:

  • 编译:由编译器逐个对源文件做词法分析、语法分析、语义分析等操作,最终生成多个目标文件每个目标文件都是二进制文件,但由于它们会相互调用对方的函数或变量,还可能会调用某些链接库文件中的函数或变量,编译器无法跨文件找到它们确切的存储地址,所以这些目标文件无法单独执行。
  • 链接:对于各个目标文件中缺失的函数和变量的存储地址(后续简称“缺失的地址”),由链接器负责修复,并最终将所有的目标文件和链接库组织成一个可执行文件

两种链接库

一个目标文件中使用的函数或变量,可能定义在其他的目标文件中,也可能定义在某个链接库文件中。链接器完成完成链接工作的方式有两种,分别是:

  • 无论缺失的地址位于其它目标文件还是链接库,链接库都会逐个找到各目标文件中缺失的地址。采用此链接方式生成的可执行文件,可以独立载入内存运行;
  • 链接器先从所有目标文件中找到部分缺失的地址,然后将所有目标文件组织成一个可执行文件。如此生成的可执行文件,仍缺失部分函数和变量的地址,待文件执行时,需连同所有的链接库文件一起载入内存,再由链接器完成剩余的地址修复工作,才能正常执行。

我们通常将第一种链接方式称为静态链接,用到的链接库称为静态链接库;第二种链接方式中,链接所有目标文件的方法仍属静态链接,而载入内存后进行的链接操作称为动态链接,用到的链接库称为动态链接库

  • 静态链接库是在生成可执行文件之前完成所有链接操作,使用的库文件称为静态链接库;
  • 动态链接库将部分链接操作推迟到程序执行时才进行,此过程使用的库文件称为动态链接库。

静态链接库

采用静态链接库完成链接操作,存在诸多缺点。

  • 首先,可执行文件内部拷贝了所有目标文件和静态链接库的指令和数据,文件本身的体积会很大。当系统中存在多个链接同一个静态库的可执行文件时,每个可执行文件中都存有一份静态库的指令和数据,就会造成内存空间的极大浪费
  • 此外,一旦程序中有模块更新,整个程序就必须重新链接后才能运行。假设一个程序有 20 个模块构成,每个模块的大小为 1 MB,那么每次更新任何一个模块,用户就必须重新获取 20 MB 的程序,对用户很不友好。

动态链接库

实际上,动态链接库是 Windows 平台上对动态链接过程所用库文件的称谓,Linux 平台上习惯称为共享库共享对象文件。

对于一个以动态链接方式运行的项目,首先由静态链接器将所有的目标文件组织成一个可执行文件,运行时将所需的动态链接库全部载入内存,由动态链接器完成可执行文件和动态库文件的链接工作 。

和静态链接库相比,动态链接库特点如下:

  • 可以很好地解决空间浪费和更新困难的问题。动态链接库和可执行文件是分别载入内存的,因此动态链接库的体积通常会小一些。

  • 当有多个程序使用同一个动态链接库时,所有程序可以共享一份动态链接库的指令和数据,避免了空间的浪费。

  • 采用动态链接的方式也可以方便程序的更新和升级,当程序的某个模块更新后,只需要将旧的模块替换掉,程序运行时会自动将所有模板载入内存并动态地链接在一起。

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

libdll 介绍

在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件

在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件

那么上述静态库和动态库中的lib有什么区别呢?

静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中

动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接库介绍 的相关文章

  • 是否有与 posix_memalign 对应的 C++ 版本?

    当我打电话时posix memalign http man7 org linux man pages man3 posix memalign 3 html为类型的对象分配对齐的内存Foo在我的 C 代码中 我需要做一个reinterpret
  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐

  • css3动画支持ie9,internet explorer - CSS3 animation not working in IE9 - Stack Overflow

    CSS3 animations are not working in IE9 Here is the jfiddle link Is it possible to make them working on IE or i am making
  • 大数据毕设选题 - 深度学习火焰识别检测系统(python YOLO)

    文章目录 0 前言 1 基于YOLO的火焰检测与识别 2 课题背景 3 卷积神经网络 3 1 卷积层 3 2 池化层 3 3 激活函数 3 4 全连接层 3 5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV5 4
  • SQLi LABS Less 14 报错注入+布尔盲注

    第十四关双引号字符串型注入 推荐使用报错注入 布尔盲注 目录 一 功能分析 二 思路分析 三 解题步骤 方式一 报错注入 第一步 判断注入点 第二步 判断报错条件 第三步 脱库 方式二 布尔盲注 第一步 判断注入条件 第二步 判断长度 第三
  • 振荡器与谐振器(有源晶振无源晶振)

    振荡器与谐振器 有源晶振无源晶振 时间 2012 08 15 22 48 11 来源 作者 llmao 点击数 QQ空间 新浪微博 腾讯微博 人人网 更多 0 Oscillator 振荡器 有源晶振 Crystal 晶体 无源晶振 RESO
  • android:AsyncTask的介绍和使用

    1 AsyncTask 1 1 为什么要使用AsyncTask 由于android开发时 不允许在主线程中进行耗时操作 网络请求 ui改变等 所以需要在子线程中进行相应的耗时操作 为了满足多线程之间的通信 提出了Handler类 异步操作的
  • 适用于 Linux 的 8 个最佳 CAD 应用程序

    计算机辅助设计 CAD 是使用计算机技术进行设计和设计文档的过程 但是有没有适用于 Linux 的好的免费 CAD 应用程序 奇怪的是 这是我们在邮件中经常收到的问题之一 我们将尝试在这里不仅列出免费的 CAD 应用程序 还会列出在 Lin
  • position:sticky粘性定位的几种巧妙应用与理解。

    一 粘性布局的定义 position sticky又称为粘性定位 是css3新增的 粘性定位的元素依赖于用户的滚动 在相对定位 relative 与固定定位 fixed 之间进行切换 基于位偏移的值进行偏移 粘性定位可以被认为是相对定位和固
  • Windows 命令行下路由命令的详解

    route命令主要用来管理本机路由表 可以查看 添加 修改或删除路由表条目 使用 Route 命令行工具查看并编辑计算机的 IP 路由表 Route 命令和语法如下所示 route f p Command Destination mask
  • 反向代理

    正向代理 客户端知道服务端 通过代理端连接服务端 代理端代理的是服务端 反向代理 所谓反向 是对正向而言的 服务端知道客户端 客户端不知道服务端 通过代理端连接服务端 代理端代理的是客户端 代理对象恰好相反 故名反向代理 正向代理的概念 正
  • linux动态库查找路径以及依赖关系梳理

    编译时与运行时库的路径 linux下 编译时与运行时库的搜索路径是不同的 运行时动态库的路径搜索顺序 LD PRELOAD环境变量 一般用于hack 编译目标代码时指定的动态库搜索路径 指的是用 wl rpath 或 R选项而不是 L re
  • 可观测统计数据上因果推断----因果图模型

    基于前文的分析 在统计可观测数据上做因果推断是可以的 但是要满足一个基本的前提条件就是可忽略性 表述为干预变量Z与干预结果 Y 0 Y 1 在给定混淆变量X的前提下条件独立 在满足了这个条件后 如何形式化的表示这种因果推断呢 目前有两种经典
  • redis锁

    if redisHelper tryLock key 3 try log info 申请成功 finally redisHelper release key log info 释放锁 else log info 没获取到锁
  • 禁用无线键盘指定按键

    文章目录 前言 主体 前言 睡一觉把键盘压坏了一个按键 一开机键盘就自动打出这个字母 我在想用其他按键平替这个字母即可 使用软件修改内部的映射 那么使用autoHotkey软件是十分容易做到的 主体 letter replace ahk 创
  • 堆栈的生长方向和空栈满栈的区别

    在STM32中 堆栈是向下生长的满栈 Cortex M4 M3 处理器拥有 R0 R15 的寄存器组 其中 R13 作为堆栈指针 SP SP 有两个 但在同一时刻只能有一个可以看到 这也就是所谓的 banked 寄存器 PUSH R0 R1
  • 嘟囔

    双十一复盘感受 GMV冲上去了 可是后期退货和客诉谁来善后 一味的追求美丽的经济泡沫真的是企业生存之道吗 未来十年何去何从 2020 11 14 南京 苏宁易购总裁办公室供应链管理部
  • 还是决定去华为了!

    Datawhale分享 作者 李博杰 中国科学院大学博士 大家好 现在越来越多人选择读博士 有人说博士不愁就业 也有人说读博浪费时间的 工作卷 还有年龄焦虑 大多数博士毕业后也都不再年轻 博士毕业后 就业到底如何 今天在某乎看到一篇非常不错
  • linux桌面小程序开发日记_1(pyqt5 + yolov5)

    linux桌面小程序开发日记1 从零开始配置VM虚拟机 安装必要的软件vscode anaconda和pyqt5环境 最后一篇博客地址 https blog csdn net Liuchengzhizhi article details 1
  • Au cs6怎样才能导入和导出m4a或者就是aac格式的文件呢?

    求解 Au cs6怎样才能导入和导出m4a或者就是aac格式的文件呢 汉化版 解决发法 首选项 常规 媒体与暂存盘 动态链接媒体下面的启动DLMS格式支持打钩 在媒体浏览器内启用DLMS预览打钩 英文版edit preference med
  • C++ 逻辑与或非 逻辑与逻辑或 逻辑非

    文章目录 逻辑非 逻辑与 逻辑或 逻辑运算符 与 或 非 作用 根据表达式的值返回真值或者假值 逻辑非 include
  • 链接库介绍

    什么是库 计算机中 有些文件专门用于存储可以重复使用的代码块 例如功能实用的函数或者类 我们通常将它们称为库文件 简称 库 Library 以 C 语言为例 如下展示一个函数库 myMath c int add int a int b re