动态链接库、静态库、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中导出的函数。

在运行Windows程序时,它通过一个被称作“动态链接”的进程与Windows相接。一个Windows的.EXE文件拥有它使用不同动态链接库的引用,所使用的函数即在那里。当Windows程

序被加载到内存中时,程序中的调用被指向DLL函数的入口,如果DLL不在内存中,系统就将其加载到内存中。

当链接Windows程序以产生一个可执行文件时,你必须链接由编程环境提供的专门的“导入库(import library)库”。这些导入库包含了动态链接库名称和所有Windows函数调用的

引用信息。链接程序使用该信息在.EXE文件中构造一个表,当加载程序时,Windows使用它将调用转换为Windows函数。

静态库与导入库的区别:
导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了

地址符号表等,确保程序找到对应函数的一些基本地址信息。

静态链接与动态链接:

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

动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。

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

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

动态库:

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

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

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

总上,我个人认为,如果你的系统上有多个应用程序都使用该库的话,就把它编译成动态库,这样虽然刚启动的时候加载比较慢,但是多任务的时候会比较节省内存;如果你的系统上只有一到两个应用使用该库,并且使用的API比较少的话,就编译成静态库吧,一般的静态库还可以进行裁剪编译,这样应用程序可能会比较大,但是启动的速度会大大提高。

呵呵,个人的一些心得,不足之处,欢迎指出!

静态链接与动态链接的区别相关推荐

  1. linux gcc 静态编译,GCC 程序编译的静态链接和动态链接

    (给Linux爱好者加星标,提升Linux技能)转自:Mr_Bluyee 在链接阶段中,所有对应于源文件的 .o 文件.'-l' 选项指定的库文件.无法识别的文件名(包括指定的.o目标文件和.a库文件 ...

  2. 静态库调用_静态链接和动态链接对比简析

    0. 简介 在Linux环境下进行开发工作,代码要经过编译链接生成二进制可执行文件,才能被CPU识别并执行:程序的编译过程可以参考另外一篇文章<linux程序编译过程简析>:链接过程分为两 ...

  3. c++定义一个动态全局变量_静态链接与动态链接的宏观概述及微观详解

    静态链接与动态链接的宏观概述及微观详解 第一部分 宏观概述 1. 静态链接 静态链接就是在程序运行前,链接器通过对象文件中包含的重定位表,完成所有重定位操作,并最终形成一个在运行时不需要再次进行依赖库 ...

  4. 装入归档文件时出现了一个错误linux_静态链接与动态链接(Linux)

    前言 上一篇分享了静态链接与动态链接的实验(Windows下).这一篇分享Linux下的笔记,同时对上一篇笔记做一个补充. 首先,我们把静态链接与动态链接做一个这样子的比喻: 把链接过程看做我们平时学 ...

  5. libcurl linux 静态链接库_GCC 程序编译的静态链接和动态链接

    转自:Mr_Bluyee 在链接阶段中,所有对应于源文件的 .o 文件."-l" 选项指定的库文件.无法识别的文件名(包括指定的.o目标文件和.a库文件)按命令行中的顺序传递给链接 ...

  6. C语言 | Linux下的静态链接与动态链接

    1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! 前言 上一篇分享了静态链接与动态链接的实验(Windows): ...

  7. 静态链接与动态链接原理

    示例程序 main.c: #include <stdio.h>void print_banner() {printf("Welcome to World of PLT and G ...

  8. 静态库、动态库、静态链接、动态链接、系统运行库混合、MD MT默认库冲突问题

    一.静态库项目 静态库lib:(注意和"静态运行库"区分)   就是.lib文件,一个.c或.cpp会编译成一个.obj,多个.obj可以组合成一个.lib库.lib=多个obj. ...

  9. 【计算机基础】静态链接与动态链接

    文章目录 一.前言 二.编译 三.链接 1. 静态链接 2. 动态链接 3. 总结 四.库 参考链接 一.前言 一段代码从文本编辑器上产生到最终能够在机器上运行,经历了非常多的阶段,概括而言,至少包含 ...

最新文章

  1. 数据库设计的三大范式
  2. Gartner预测2019年十大「数据和分析技术」趋势:增强型分析成为重要卖点
  3. 2016年十大存储预测
  4. jupyter notebook使用opencv的例子_Python安装Jupyter Notebook配置使用教程
  5. 连接数据库时提示归档器失败 ORA-00257: archiver error
  6. clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
  7. 90后占六成 花小猪如何吸引年轻人又安全不减配?
  8. 报告PPT(163页):基于Python语言的课程群建设探讨与实践
  9. myeclipse 8.0GA 安装注册步骤
  10. MATLAB中滤波演示
  11. linux压缩到最小命令,Linux 压缩打包命令详细教程
  12. 那些拿到腾讯、阿里等大厂offer的人,都有这个共同点
  13. 遥感原始图像计算机格式,卫星遥感影像数据是什么样格式的?
  14. ACL总结与实验探讨
  15. cdb.exe的利用
  16. C语言查询ask码的函数,ask码(字符转成ascii码)
  17. R 计算时间序列的交叉相关性教程
  18. 在Python中画炫酷的K线图
  19. android usb 从模式切换,android5.1-在系统设置里添加设置选项 以及 USB-OTG 模式切换...
  20. python:比较人脸识别中gallery数据集和prob数据的IP

热门文章

  1. 解决 java.lang.IllegalArgumentException: Repository interface must not be null on initialization!
  2. 日常问题 - 远程服务器运行Tomcat出现卡顿阻塞
  3. Prime Distance POJ - 2689 线性筛
  4. C#动态操作DataTable(新增行、列、查询行、列等)
  5. 【hdu 6444】Neko's loop
  6. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会
  7. photoshop最全快捷键列表
  8. python3字符串属性(二)
  9. Java集合---Arrays类源码解析
  10. python中del语句