动态链接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的动态库和静态库的目录:

opencv的库目录

bin文件夹下放的是.dll文件,lib文件夹下放的是.lib文件;staticlib文件夹下放的是也.lib文件
但是lib文件夹下的是动态链接的引入库(.lib)文件,staticlib文件夹下放的是静态链接的二进制文件(.lib)。

同时可以看到staticlib文件夹下的.lib文件比lib文件夹下的.lib文件大很多,这是因为静态链接的二进制文件(.lib)包含实际执行代码、符号表等等(较大),动态链接的引入库文件(.lib)包含该DLL导出的函数和变量的符号名(较小)。

staticlib文件夹下的.lib文件
lib文件夹下的calib3d2413.lib

同时注意:静态库(.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

0 0
原创粉丝点击