当前位置: 首页 > news >正文

什么是函数库和动态链接库?

函数库和动态链接库(也称为共享库)是在软件开发中常见的两种代码重用技术,它们有助于组织、共享和管理代码。在本文中,我们将详细解释函数库和动态链接库的概念、用途以及它们的工作原理。

## 什么是函数库?

函数库是一组预先编写好的函数或程序代码的集合,用于执行特定的任务或功能。这些函数通常被组织成一个单独的文件,可以在需要时被多个程序调用和重复使用。函数库的主要目的是提供一种代码重用机制,以便开发人员可以节省时间和精力,避免重复编写相同的代码。

函数库可以分为以下两种主要类型:

### 1. 静态函数库

静态函数库也称为静态链接库,它是在编译时与程序一起链接的库。当程序被编译时,编译器将所需的函数库的代码复制到程序的可执行文件中。这意味着可执行文件包含了所有它需要的代码和数据,不需要外部的库文件支持。静态函数库的文件通常具有 `.a`(在Unix/Linux系统上)或 `.lib`(在Windows系统上)的扩展名。

主要优点和缺点:

- **优点**:
  - 执行速度快:因为所有代码都包含在可执行文件中,所以没有库加载的开销。
  - 稳定性高:不受外部库的版本变化影响,确保了可执行文件的稳定性。

- **缺点**:
  - 占用磁盘空间:每个可执行文件都包含了完整的库代码,可能会使可执行文件变得很大。
  - 不灵活:如果库有更新或修复,需要重新编译和重新分发可执行文件。

### 2. 动态函数库

动态函数库,也称为动态链接库或共享库,是在运行时由操作系统加载的库。与静态函数库不同,可执行文件只包含对动态库的引用,而不包含实际的库代码和数据。当程序运行时,操作系统会查找并加载所需的动态库,将其链接到进程中。动态函数库的文件通常具有 `.so`(在Unix/Linux系统上)或 `.dll`(在Windows系统上)的扩展名。

主要优点和缺点:

- **优点**:
  - 节省内存:多个程序可以共享相同的库,节省内存空间。
  - 易于维护:如果库需要更新或修复,只需更新一次库文件,所有依赖它的程序都可以受益。
  - 灵活性:可以在不重新编译程序的情况下更新库文件。

- **缺点**:
  - 加载开销:在程序运行时加载库文件会产生一些性能开销。
  - 版本兼容性:需要确保库的向后兼容性,以便新版本的库能够与旧版本的程序一起工作。

## 什么是动态链接库?

动态链接库(DLL,Dynamic Link Library)是一种特殊类型的共享库,通常在Windows操作系统中使用。与标准的动态函数库类似,DLL包含了一组函数和数据,但它具有一些特定的特征:

- **独立性**:DLL文件通常是独立的,它们可以包含一个或多个相关的函数或类。这使得它们可以轻松地被分发、加载和卸载。

- **导出函数**:DLL文件中的函数必须明确标记为“导出”,以便其他程序可以调用它们。这些导出函数的符号信息通常包含在DLL的导出表中。

- **动态加载**:与标准的动态函数库一样,DLL也是在运行时动态加载的。当一个程序启动并需要使用DLL中的函数时,操作系统会加载相应的DLL。

- **版本管理**:Windows操作系统提供了一种版本管理机制,允许不同版本的DLL共存,并确保程序使用正确的版本。这是为了解决DLL Hell(DLL地狱)问题,即不同版本的DLL文件之间可能发生冲突。

DLL在Windows中被广泛用于扩展系统功能、提供插件支持、共享代码和提供可升级的组件。

## 函数库和动态链接库的用途

函数库和动态链接库在软件开发中有多种用途,以下是一些常见的用途:

### 1. 代码重用

函数库和动态链接库使得开发人员可以编写一次代码,并在多个项目中重复使用。这提高了代码的可维护性,减少了重复劳动,以及降低了开发时间和成本。

### 2. 模块化开发

通过将功能划分为模块,并将这些模块存储在库文件中,开发人员可以更轻松地管理和维护代码。每个模块都可以独立开发、测试和维护,而不会干扰其他模块。

### 3. 插件支持

动态链接库常用于实现插件系统。应用程序可以在运行时加载插件,从而扩展其功能。这使得应用程序可以更容易地支持第三方开发者创建定制插件,增强应用程序的功能。

### 4. 跨平台开发

函数库和动态链接库使得代码可以在不同的操作系统上重复使用。只需编译和链接适合

特定平台的库,就可以在多个平台上运行相同的程序。

### 5. 版本管理

动态链接库提供了版本管理机制,允许多个版本的库共存,并确保程序使用正确的版本。这是确保升级和维护库文件时不会破坏现有应用程序的重要机制。

## 函数库和动态链接库的工作原理

### 函数库的工作原理

1. **编译时链接**:在使用静态函数库时,编译器会将函数库的代码和数据直接复制到可执行文件中。这意味着可执行文件包含了所有它需要的代码和数据,成为一个独立的实体。

2. **运行时链接**:在使用动态函数库时,编译器仅包含对库的引用信息,不包含实际的库代码和数据。当程序运行时,操作系统会查找并加载所需的动态库,将其链接到进程中。这个过程通常在程序启动时或第一次使用库中的函数时发生。

### 动态链接库的工作原理

1. **DLL导出函数**:DLL中的函数必须明确标记为“导出”,以便其他程序可以调用它们。导出函数的符号信息通常包含在DLL的导出表中。

2. **查找和加载DLL**:当一个程序启动并需要使用DLL中的函数时,操作系统会查找和加载相应的DLL。这个过程通常包括以下步骤:
   - 在程序目录中查找DLL。
   - 在系统目录和已注册的DLL路径中查找DLL。
   - 如果找到了,操作系统会加载DLL,并将其链接到进程中。

3. **符号解析和链接**:操作系统会将程序中对DLL函数的引用解析为实际的函数地址。这通常包括符号重定位过程,确保引用的函数能够正确连接到DLL中的函数。

4. **运行程序**:一旦DLL中的函数已链接到程序中,程序就可以正常运行,调用DLL中的函数来执行特定的任务。

总之,函数库和动态链接库都是在软件开发中用于组织、共享和管理代码的重要工具。它们使得代码重用变得容易,帮助开发人员更有效地开发和维护软件项目。选择使用哪种库取决于项目的需求,静态函数库在性能和稳定性方面具有优势,而动态链接库在资源共享和升级维护方面更为灵活。函数库和动态链接库的概念和使用方法对于C语言初学者来说都是非常重要的,因为它们是构建大型和可维护软件的关键工具之一。

相关文章:

什么是函数库和动态链接库?

函数库和动态链接库(也称为共享库)是在软件开发中常见的两种代码重用技术,它们有助于组织、共享和管理代码。在本文中,我们将详细解释函数库和动态链接库的概念、用途以及它们的工作原理。 ## 什么是函数库? 函数库是…...

POM配置

dependencies 所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承 dependencyManagement 只是声明依赖,并不会自动引入,因此子项目需要显示声明依赖。在子项目中声明了依赖项,且没有指定具体版本&#x…...

微电网单台并网逆变器PQ控制matlab仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 微电网运行在并网模式下且公共电网供应正常时,因为公共电网给定了电 压和频率的参考值,所有的逆变器可以使用PQ控制方式。 当系统频率为额定频率f0时,系统稳定在A点&#x…...

计算机毕业设计选什么题目好?springboot 旅游网站

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...

Android Fragment中使用Arouter跳转到Activity后返回Fragment不回调onActivityResult

Fragment中通过路由跳转到Activity 跳转传递参数 通过Arouter跳转 Postcard postcard ARouter.getInstance().build(RouterConstant.ACTION_TRANSMANAGERACTIVITY1);Bundle bundle new Bundle();bundle.putInt("code", 404);postcard.with(bundle); //设置bundlef…...

hive add columns 后查询不到新字段数据的问题

分区表add columns 查询不到新增字段数据的问题; 5.1元数据管理 (1)基本架构 Hive的2个重要组件:hiveService2 和metastore,一个负责转成MR进行执行,一个负责元数据服务管理 beeline-->hiveService2/spar…...

【linux】权限相关问题

【linux】权限相关问题 一.用户的分类sudo 二.文件执行的权限i. 文件的分类ii.人的分类三.修改创建文件的权限chmod更改文件创造的默认权限(umask) 三.删除(粘滞位) 一.用户的分类 在我们使用linux的时候,有用户类型的区分,不同用…...

“.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“一

目录 第一单元:二十一世纪程序执行 背景: 总结: 第二单元:对象导向与类别设计 背景: 总结: 第三单元:使用类别与基底类别库 总结: 第四单元:Windows开发程序 背景: 总结: 第五单元:防护式程序设计 背景: 总结: 第六…...

02-RocketMQ开发模型

目录汇总:RocketMQ从入门到精通汇总 上一篇:01-RocketMQ整体理解与快速实战 上一部分,我们可以搭建RocketMQ集群,然后也可以用命令行往RocketMQ写入消息并进行消费了。这一部分我们就来看怎么在项目中用上RocketMQ。 一、RocketMQ…...

第83步 时间序列建模实战:Catboost回归建模

基于WIN10的64位系统演示 一、写在前面 这一期,我们介绍Catboost回归。 同样,这里使用这个数据: 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…...

开源任务调度框架

本文主要介绍一下任务调度框架Flowjob的整体结构,以及整体的心路历程。 功能介绍 flowjob主要用于搭建统一的任务调度平台,方便各个业务方进行接入使用。 项目在设计的时候,考虑了扩展性、稳定性、伸缩性等相关问题,可以作为公司…...

Android Native 开发 要点记录

Android Studio 中写 C 代码 android studio创建C项目_android studio native c-CSDN博客 项目配置参考 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)_【cmake】cmakelists.txt的超傻瓜手把手教程(附实例源码)-CSDN博客 CMakeLists.txt 讲解…...

数据库中查询所有表信息,查询所有字段信息

MYSQL中 所有表信息 information_schema.tables表 SELECT * FROM information_schema.tables -- TABLE_NAME 表名 -- TABLE_COMMENT 表中文名所有字段信息 information_schema.COLUMNS表 SELECT * FROM information_schema.tables -- TABLE_SCHEMA 数据库名 -- COLUMN…...

改进智能优化算法常用指标一键导出为EXCEL,最优值,平均值,标准差,最差值,中位数,秩和检验,箱线图...

声明:对于作者的原创代码,禁止转售倒卖,违者必究! 为了突出改进智能优化算法的效果,常常会将改进的智能算法与其他算法进行对比。 在一些期刊论文中,经常会看到一个超级大的表格,统计着每个算法…...

在asp.net中,实现类似安卓界面toast的方法(附更多弹窗样式)

目录 一、背景 二、操作方法 2.1修改前 2.2修改后 三、总结 附:参考文章: 一、背景 最近在以前的asp.net网页中,每次点击确定都弹窗,然后还要弹窗点击确认,太麻烦了,这次想升级一下,实现…...

一站式解决方案:Qt 跨平台开发灵活可靠

一站式解决方案:Qt 跨平台开发灵活可靠 Qt 是一种跨平台开发工具,为开发者提供了一站式解决方案。无论您的项目目标是 Windows、Linux、macOS、嵌入式系统还是移动平台,Qt 都能胜任。这种跨平台的特性不仅节省开支,还推动了战略的…...

将cpu版本的pytorch换成gpu版本

1.首先激活虚拟环境 winRcmd 打开dos命令窗口 查看虚拟环境列表 conda env list 激活虚拟环境 2.将原来的pytorch_cpu版本换成gpu版本 注意:安装gpu版本的pytorch时并不需要先卸载原来的cpu版本pytorch,安装时会自己替换的 打开pytorch官网查看以前版本 Previo…...

Ubuntu安装QQ

原文网址:2023在Ubuntu安装最新版QQ Linux v3.1.0 - 哔哩哔哩 作者:sprlightning https://www.bilibili.com/read/cv22100663/ 出处:bilibili 2022年末QQ推出了QQ Linux v3.0系列,目前最新版是今年2月24日推出的v3.1.0版本。注意…...

【Python】实现excel文档中指定工作表数据的更新操作

在做数值计算时,个人比较习惯利用excel文档的公式做数值计算进行对比,检查异常,虽然计算量大后,excel计算会比较缓慢,但设计简单,易排错 但一般测试过程中使用到的数据都不是最终数值,会不停根据…...

力扣(LeetCode)2731. 移动机器人(C++)

脑经急转弯排序 碰撞只改变运动方向,速度始终如"1",且机器人视为无差别的,所以碰撞等于擦肩而过!"机器人碰撞,到底撞没撞,如撞。"因此只考虑每个机器人单方向移动,d秒后停…...

vite和webpack

vite和webpack 文章目录 vite和webpackvite介绍什么是vite为什么使用vitevite优缺点热更新的实现原理 webpack介绍什么是webpackwebpack 优缺点 Vite 为什么比 Webpack 快vite和webpack的区别面试问题Vite为什么比webpack快? vite介绍 什么是vite Vite 是新型前端…...

MinIO图片正常上传不可查看,MinIO通过页面无法设置桶为public

项目场景:国产中标麒麟操作系统部署MinIO正常启动后发现图片能正常上传,但是匿名浏览该图片的时候无法查看。通过网络查询解决方案,得出的结论是:需要把当前上传文件的桶设置为public,由于创建桶默认是private且不可通过浏览器进行…...

Linux 指令心法(七)`cat` 查看、合并和创建文本文件

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 cat 是 “concatenate” 的缩写,它是一个 Linux 和 Unix 系统中的命令,用于查看、合并和创建文本文件。cat 主要用于以下几个方面&…...

解决docker开启MySQL的binlog无法成功。docker内部报错:mysql: [ERROR] unknown variable

1. 报错信息 2. 操作流程 整个流程是这样的: 我愉快的输入docker ps,查看MySQL的docker 容器id 执行指令docker exec -it 8a \bin\bash进入容器内部执行vim /etc/my.cnf,打开配置文件按照网上说的,添加如下配置信息退出docker容…...

c,python ,java,c++ c#在控制台打印彩色文本

在C语言、Java和C#中,你可以通过使用特定的控制字符或库来设置文本颜色。下面分别演示如何在这三种编程语言中实现文本颜色的设置: 在C语言中实现文本颜色设置: C语言中的颜色设置通常依赖于特定的终端或操作系统。以下是一种使用C语言的方…...

MySQL数据库技术笔记(5)

聚合函数: count(): 统计某种数据的数量 sum(): 统计某种数据的总和 max(): 某种数据的最大值 min(): 某种数据的最小值 avg(): 某种数据的平均值 排序的用法 : 关键字 order by 升序 : ASC (从小到大排序) 默认为升序 降序 : DESC…...

python生成随机数

在Python中生成随机数可以使用内置的random模块。以下是一些生成随机数的示例: 生成一个0到1之间的随机浮点数: import random random_float random.random() print(random_float) 生成一个指定范围内的随机整数: import random random_int…...

Twitter优化秘籍:置顶、列表、受众增长

在 Twitter 上,将你的一条推送文置顶到个人数据顶部是提高可见性和吸引关注者的绝佳方式。无论你是个人用户还是企业,此功能都可以让你的重要信息常驻在众人眼前,即使你发布了新的推文。接下来,我们将分享一些优化建议&#xff0c…...

vscode更改为中文版本

方式一 在扩展里安装chinese插件 方式二 1.Ctrl+ Shift +P(commandshiftP) 2.输入Configure display Language 3.选择zh-cn 这时候vscode会提示需要重启,点击restart重启vscode,重启后vscode就会显示中…...

【Linux系统KVM虚拟机实战】LVM逻辑卷之磁盘扩容

【Linux系统KVM虚拟机实战】LVM逻辑卷之磁盘扩容 一、LVM与KVM介绍1.1 LVM介绍1.2 KVM介绍1.2.1 KVM简介1.2.2 KVM优点二、本次实践介绍2.1 本次实践简介2.2 环境规划三、虚拟机环境检查3.1 检查KVM虚拟机磁盘空间3.2 KVM虚拟机检查系统情况3.3 检查物理磁盘分区3.4 查看PV状态…...