动态链接DLL与静态链接LIB
来源:互联网 发布:乐高软件中文版 编辑:程序博客网 时间:2024/06/02 07:28
背景
动态链接与静态链接一直以为很清楚,后来遇到bug才知道自己不是很清楚!
静态链接
静态库(.lib):函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE文件)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。
动态链接
动态库(.lib文件和.dll文件):在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质的区别,对一个DLL文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不可复制到可执行文件,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。这时,在发布产品时,除了发布可执行文件以外,同时还需要发布该程序将要调用的动态链接库。
例子
以opencv2.4.13为例来说明,下图是opencv的动态库和静态库的目录:
bin文件夹下放的是.dll文件,lib文件夹下放的是.lib文件;staticlib文件夹下放的是也.lib文件
但是lib文件夹下的是动态链接的引入库(.lib)文件,staticlib文件夹下放的是静态链接的二进制文件(.lib)。
同时可以看到staticlib文件夹下的.lib文件比lib文件夹下的.lib文件大很多,这是因为静态链接的二进制文件(.lib)包含实际执行代码、符号表等等(较大),动态链接的引入库文件(.lib)包含该DLL导出的函数和变量的符号名(较小)。
同时注意:静态库(.lib)和动态库(.lib文件和.dll文件)都debug和release之分。
参考
VC++深入详解(孙鑫修订版)
http://www.cppblog.com/amazon/archive/2009/09/04/95318.html
http://blog.sina.com.cn/s/blog_6dd65c6f0100vveq.html
- 动态链接DLL与静态链接LIB
- 关于静态链接库(Lib)与动态链接库(DLL)
- 关于静态链接库(Lib)与动态链接库(DLL)
- .h .lib .dll文件,静态链接库与动态链接库,静态调用与动态调用
- 动态链接库(.dll、.lib)与静态链接库(.lib)的创建与使用
- 动态链接库dll,导入库lib 与 静态链接库lib
- LIB和DLL的区别与使用(静态链接库与动态链接库的区别)
- Lib静态链接库和Dll动态链接库
- 静态链接库LIB和动态链接库DLL
- DLL动态链接库和LIB静态链接库
- 【转】Lib静态链接库和Dll动态链接库
- 静态链接库LIB和动态链接库DLL
- 静态链接库(Lib)和动态链接库(DLL)
- DLL动态链接库和LIB静态链接库
- 静态链接库LIB和动态链接库DLL
- lib静态链接库,dll动态链接库,h文件
- 静态链接库(Lib)与动态链接库(DLL)的区别
- [转]: 静态链接库, 动态链接库, DLL文件 与 LIB文件
- Java 实现文件下载
- 弹出样式封装
- QT5(15)模拟登陆百度
- .bat脚本基本命令语法
- Linux netstat 命令
- 动态链接DLL与静态链接LIB
- hdu 大菲波数
- 将String转换成NSdate,并获取日期、小時、分钟(swift2.3)
- angular-ui-grid IE8版本简介
- jQuery插件之ajaxFileUpload
- jface databinding: 创建readonly(只读)可观察对象(observable)
- 12月英语总结
- 24小时天气(可滑动)
- LinearLayout布局