动态链接库和静态链接库的原理及区别

2023-11-15

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件。

动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
动态链接的主要目的:把程序与他们使用的特定的函数库版本中分离开来。

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。

静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

动态链接的优点:
(1)可执行文件的体积可以非常小,节省磁盘空间和虚拟内存,能更加有效的利用磁盘空间。
(2)链接-编辑阶段的时间会缩短(因为链接器的有些工作被推迟到载入)
(3)所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库在内存中的一个单独拷贝。这就提供了更好的I/O和交换空间利用率,节省了物理内存,提高了系统整体性能。

动态链接的缺点:运行速度比静态链接慢。

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

动态链接库和静态链接库的原理及区别 的相关文章

  • 如何使用 MSVC 从 Windows 命令行构建 DLL

    我从事 C 语言工作已经有大约 20 年了 但我从未构建过 DLL 我一直更喜欢静态链接 我使用命令行 cl exe 等 和 gnumake makefile 来构建我的 Windows 应用程序 我现在想构建一个DLL 但我很困惑 最终
  • Windows 上的 Qt QMYSQL“驱动程序未加载”

    当尝试连接到 mysql 数据库时 我收到以下错误 驱动程序未加载 我已经创建了一个安装程序 其中包含所有需要的 DLL 文件 libmysql dll plugins qsqlmysql dll QT5Sql 等 在新安装的 Window
  • 不使用相关性直接在ASM中调用/跳转(x86)

    我正在将一个 C DLL 注入到游戏中 并且想将一个函数挂接到我自己的一些代码上 由于DLL每次都会映射到不同的位置 因此直接跳转和调用会更容易 另外 因为这是一个钩子 所以当我返回该函数时 我不想更改堆栈或寄存器 我声明一个 char 来
  • 如何从类库项目加载视图?

    我尝试创建一个VirtualPathProvider并将视图设置为嵌入资源 class AssemblyResourceVirtualFile VirtualFile string path public AssemblyResourceV
  • DUMPBIN 实用程序损坏的名称输出

    我正在使用 DUMPBIN 实用程序从 c dll 中获取损坏的名称以在 c 应用程序中使用 我使用 declspec dllexport 公开一个 C 类成员函数 输出的损坏名称结果如下 InitPort CProtocolStack Q
  • 枚举程序集的所有已安装版本(在 GAC 中)

    是否可以使用 C 枚举 GAC 中程序集的所有已安装版本 例如 我有一个名为 My Assembly 的程序集 该程序集可能有各种版本 1 0 0 0 2 3 4 5 0 1 2 4 等 并且可以针对各种平台 x86 x64 任何 CPU
  • find_library 选择静态库而不是共享库

    This 之前曾被问过 https stackoverflow com questions 3537588 issue on using cmake with msys mingw linking dll files using devil
  • CreateRemoteThread 返回 ERROR_ACCESS_DENIED - Windows 7 DLL 注入

    我正在尝试编写一个使用CreateRemoteThread注入一个dll 问题是 CreateRemoteThread 拒绝工作 GetLastError 返回 5 即 ERROR ACCESS DENIED 我不明白为什么 我正在根据这个
  • 葡萄酒规格文件

    我有一个名为的 Windows DLLmorag dll包含函数 foo 和 bar 我还有一个名为的 Linux SOmorag so包含 foo 和 bar 的 Linux 实现 每个平台上的参数相同 我有一个可以加载的 Windows
  • 如何找到“无法加载‘xxx.dll’导入的过程”的来源。例外?

    过去一周我一直在追求这个例外 情况是 我有一个用 C 编写并在 Visual Studio 2010 中构建的应用程序 该应用程序包含一个 DLL 它是非托管代码库的包装器 非托管代码是用 C 编写的 并在 Visual Studio 20
  • ASP.NET MVC 中需要两个不同版本的 Newtonsoft.Json.dll

    我开发了一个 MVC 应用程序 它依赖于使用 Newtonsoft Json dll v6 0 0 0 的 Connectwise SDK 和使用 Newtonsoft Json dll v7 0 0 0 的 Dropbox SDK 我需要
  • 找不到如何使用 HttpContent

    我正在尝试使用HttpContent HttpContent myContent HttpContent Create SOME JSON 但我没有找到定义它的 DLL 首先 我尝试添加对Microsoft Http也System Net
  • 未找到入口点

    当我尝试运行链接到 DLL 的应用程序 我有一段时间没有更改代码 因为它工作正常 时 遇到了一个奇怪的错误 这个 DLL 曾经可以工作 但我一直在更改 DLL 的代码并使其编译正常 不幸的是 当尝试运行该应用程序时 GameTest001
  • Visual Studio 找不到引用

    我正在处理另一个人移交的一些应用程序 我必须在其中记录需求 构建和部署流程 这里的问题是 Visual Studio 2005 抛出很多错误 因为它找不到 dll 的引用 这显然不会让 VS 构建该项目 在该人的计算机上一切正常 但在我的计
  • Visual Studio 2013 设计器尝试加载错误版本的项目 DLL

    我的解决方案中有一个 Visual Studio 项目 它引用同一解决方案中的类库项目 该项目编译并执行得很好 但是 当我尝试在设计器中打开一个表单时 我收到一条消息 无法加载文件或程序集 MyLibName Version 1 0 547
  • 如何使用 DLL 来模拟静态库的“应用程序内全局变量的多个实例”行为?

    我们有一个用 C C 编写的应用程序 它被分解为单个 EXE 和多个 DLL 这些 DLL 中的每一个都使用相同的静态库 utilities lib 实用程序静态库中的任何全局变量实际上在应用程序内运行时都会有多个实例 每个模块 即 DLL
  • 在 HP Load Runner 的 VuGen 中加载 javai.dll 时出现错误

    当我尝试在 HP load runner 的 VuGen 中编译一个简单的脚本时 无法启动 JVM 并出现以下错误 Java VM Internal Error Getting Error Loading javai dll 我在用着 HP
  • 如何从 dll 导出 C++ 类? [复制]

    这个问题在这里已经有答案了 我有一个有两个重载函数的类 如何从 dll 导出它以及如何由其他 C 类使用它 我的班级是这样的 define DECLDIREXP declspec dllexport define DECLDIRIMP de
  • 从单个应用程序中的多个线程调用 dll 函数是否安全?

    我正在 Delphi 2009 中编写一个服务器应用程序 它实现了多种类型的身份验证 每种身份验证方法都存储在单独的 dll 中 第一次使用身份验证方法时 会加载适当的 dll 仅当应用程序关闭时 DLL 才会被释放 在服务器线程 连接 之
  • 链接到大地址感知 DLL

    假设我有一个使用 LARGEADDRESSAWARE 链接器标志集构建的 DLL 现在我有一个动态链接到该 DLL 的应用程序 这是否会使我的应用程序具有大型地址意识 如果不是 那么为任何 DLL 设置此标志是否有意义 讨论here htt

随机推荐

  • gcc 若干安全相关选项

    1 FORTIFY SOURCE buffer over flow 防御 参考 http fedoraproject org wiki Security Features Compile Time Buffer Checks 28FORTI
  • Elasticsearch8.2扩容挪数据master出现异常

    背景 1 ES 8 2 版本集群 从10节点扩到20节点 变更 目标替换老的10个节点 先扩容新节点再下掉老节点 2 挪数据执行exclude API 排除老节点IP 设置迁移速率为800Mb s 默认40Mb s 异常 1 迁移过程中突然
  • python笔记第四章---选择结构

    一 程序的组织结构 fact 任何简单或复杂的算法都可以由顺序结构 选择结构和循环结构这三种基本结构组合而成 顺序结构 计算机的流程控制 选择结构 if语句 循环结构 while语句 for in语句 1 顺序结构 程序从上到下顺序的执行代
  • Linux文件权限的设置

    本文章主要介绍了对Linux文件的权限以及如何设置权限 一 查看文件的权限与属性 ls l 或者 ll查看文件属性 二 可以列出如下图所示的一些信息 rw r r 第一位代表文件类型 d 表示目录 l 表示链接文件 表示普通文件 b 表示快
  • Postman测试webService接口

    1 打开Postman界面如下 设置Content Type text xml 2 设置body 3 请求结果如下 4 至此通过Postman进行webService接口测试测试完毕
  • 使用过滤器和request装饰增强来彻底解决乱码问题

    在客户端以get或者post方式提交数据时 可能会出现客户端与服务端编码集不匹配而发生乱码的现象 在对post方式产生的乱码我们可以用 request setCharacterEncoding utf 8 语句来解决 在对get方式产生的乱
  • maven&​ Plugin ‘org.apache.tomcat.maven:tomcat7-maven-plugin:2.2’ not found​报错解决【问题及解决过程记录】

    目录 什么是 Maven 安装 解压后需要配置环境变量 在path新增路径 验证maven安装成功 Win R打开cmd 输入mvn v 在配置文件中设置本地仓库路径 maven仓库的种类和关系 编辑 maven目录结构 编辑 maven的
  • oracal从入门到精通(一)

    1 1了解最新版本Oracle 11g 可以在Oracle的官方网站www oracle com获取Oracle的版本信息 本书中要讲解的是Oracle 11g的第1版 所以在这里只对Oracle 11g的各版本做以说明 Oracle 11
  • 关于Vue.js组件巨详细的一篇文章

    文章目录 Vue js 组件 全局注册 组件基础 组件命名规则 template 选项 data 选项 局部注册 组件通信 父组件向子组件传值 props 命名规则 单项数据流 props 类型 props 验证 非 props 属性 子组
  • Iterative Shrinkage Thresholding Algorithm

    Iterative Shrinkage Thresholding Algorithm ISTA ISTA 对于一个基本的线性逆问题 y A x
  • 【Webpack5】从零开始学习基础配置

    基本使用 Webpack 是一个静态资源打包工具 它会以一个或多个文件作为打包的入口 将我们整个项目所有文件编译组合成一个或多个文件输出出去 输出的文件就是编译好的文件 就可以在浏览器段运行了 我们将 Webpack 输出的文件叫做 bun
  • [转帖]国产操作系统概念及历史,目前国产操作系统有哪些?

    国产操作系统概念及历史 目前国产操作系统有哪些 2018 05 19 21 20 18 作者 ywnz 稿源 云网牛站整理 https ywnz com linuxgcxt 1786 html 以下为你讲解国产操作系统概念 国产操作系统历史
  • 【链块观点01期】当区块链的风刮到教育行业,哪些变革是注定要发生的?

    原文链接 区块链应用案例 当区块链的风刮到教育行业 哪些变革是注定要发生的 一 教育是国之大计 古往今来 教育都在人类生活中占有着极其重要的位置 教育与社会的进步 文明的发展程度紧密相关 中国正在努力建设和谐社会 而如何达成社会主义和谐社会
  • Android Studio运行时自带签名配置过程详解

    文章转载自 http teachcourse cn 2053 html 摘要 Android Studio比Eclipse在配置Project签名文件时方便很多 可以同时指定debug和release两种模式下的签名文件 debug模式即A
  • SpringBoot的自动装配

    一 什么是SpringBoot自动装配 SpringBoot 定义了一套接口规范 这套规范规定 SpringBoot 在启动时会扫描外部引用 jar 包中的META INF spring factories文件 将文件中配置的类型信息加载到
  • Qt 交叉编译

    背景 本来Qt源码是可以直接使用交叉编译器编译通过 也可以使用编译通过的qmake生成可执行程序 但是可执行程序在没有Qt的环境下无法正常运行 因此我们不只是仅需要编译源码 还需要将依赖的环境编译出来 这样打包可执行程序的同时将相应的依赖拷
  • 爬虫项目二十一:需要简历吗?用Python轻松爬下上千份简历模板

    文章目录 前言 一 获取详情页url 二 获取下载链接 三 保存模板 前言 用Python对站长之家的上千个简历模板批量爬取保存 提示 以下是本篇文章正文内容 下面案例可供参考 一 获取详情页url 我们进入站长之家的免费模板网站 http
  • linux修改rc.local权限,CentOS7中rc.local中的指令不能生效问题。

    问题 在系统中 etc rc local设置自启动命令的时候 重启计算机 文件中的指令无法生效 我这里编译安装了一个mongodb数据库的服务 然后修改了环境变量 写入到了 bash profile 文件中 在shell中可以直接执行命令
  • idea创建python项目

    windows安装pyhon Window 安装 Python 哭哭啼的博客 CSDN博客下载官网地址 https www python org downloads windows 此处下载最新版本 64位 安装找到下载的文件解压文件即可配
  • 动态链接库和静态链接库的原理及区别

    静态连接库就是把 lib 文件中用到的函数代码直接链接进目标程序 程序运行的时候不再需要其它的库文件 动态链接就是把调用的函数所在文件模块 DLL 和调用函数在文件中的位置等信息链接进目标程序 程序运行的时候再从DLL中寻找相应函数代码 因