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

动态链接及静态链接

动态链接、静态链接:

静态链接:就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些。


动态链接:就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中。

                       然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。

                       优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能。

 

静态链接方法:#pragma comment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来 静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库。

 

动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,

                            程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。

 

 

动态链接库、静态库、import库区别:

动态链接库(Dynamic Linked Library): Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;

                                                                         User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。

 

静态库(Static Library): 函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块

                                            组合起来创建最终的可执行文件(.EXE文件)。

 

导入库(Import Library): 在使用动态链接库的时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需

                                               要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。

 

 

 

 

在软件开发的过程中,大家经常会或多或少的使用别人编写的或者系统提供的动态库或静态库,但是究竟是使用静态库还是动态库呢?他们的适用条件是什么呢?

 

简单的说,静态库和应用程序编译在一起,在任何情况下都能运行,而动态库是动态链接,顾名思义就是在应用程序启动的时候才会链接,所以,当用户的系统上没有该动态库时,应用程序就会运行失败。

 

再看它们的特点:

动态库:

1.共享:多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可;

2.开发模块好:要求设计者对功能划分的比较好。

 

静态库:代码的装载速度快,执行速度也比较快,因为编译时它只会把你需要的那部分链接进去,应用程序相对比较大。但是如果多个应用程序使用的话,会被装载多次,浪费内存。

 

总上,我个人认为,如果你的系统上有多个应用程序都使用该库的话(共享),就把它编译成动态库,这样虽然刚启动的时候加载比较慢,但是多任务的时候会比较节省内存;

如果你的系统上只有一到两个应用使用该库,并且使用的API比较少的话,就编译成静态库吧,一般的静态库还可以进行裁剪编译,这样应用程序可能会比较大,但是启动的速度会大大提高。

 

转自:http://www.cnblogs.com/kex1n/archive/2011/09/06/2168435.html

转载于:https://www.cnblogs.com/Allen-rg/p/7173106.html

相关文章:

  • BTrace实战
  • windows下安装配置hadoop
  • JavaScript(jQuery)实现打印英文格式日期
  • eclipse运行hadoop wordcount example
  • linux6.5环境下安装python
  • protobuf-2.5.0的下载与安装
  • ibatis入门
  • 将DataTable转换为ListT对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。...
  • php无限分类
  • java servlet实例
  • POJ 3154 Graveyard【多解,数论,贪心】
  • C++ 浅谈 strlen 与 sizeof的区别
  • 产品设计的原则之一:精简你的产品
  • 产品设计之二:优化你的产品细节
  • oracle创建/删除表空间、创建/删除用户并赋予权限
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 「译」Node.js Streams 基础
  • 10个确保微服务与容器安全的最佳实践
  • Debian下无root权限使用Python访问Oracle
  • Idea+maven+scala构建包并在spark on yarn 运行
  • IDEA常用插件整理
  • JavaScript中的对象个人分享
  • js中的正则表达式入门
  • Just for fun——迅速写完快速排序
  • Laravel Mix运行时关于es2015报错解决方案
  • Logstash 参考指南(目录)
  • PHP 小技巧
  • 安卓应用性能调试和优化经验分享
  • 包装类对象
  • 服务器从安装到部署全过程(二)
  • 规范化安全开发 KOA 手脚架
  • 前端面试之闭包
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 应用生命周期终极 DevOps 工具包
  • Nginx实现动静分离
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 通过调用文摘列表API获取文摘
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (floyd+补集) poj 3275
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六)c52学习之旅-独立按键
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)C#调用WebService 基础