?关于动态链接库dll跟静态链接库的疑问

?关于动态链接库dll和静态链接库的疑问?
本帖最后由 shimachao 于 2014-03-06 09:22:53 编辑
小弟近两天在看到dll的内容。了解到在动态链接库出现之前,还出现过静态库。根据网上的教程,静态库只需要提交给用户一个.h文件和一个.lib文件就可以了。而动态链接库必须提供一个.h文件、一个.lib文件和一个.dll文件。

那么
1.我们写MFC程序的时候,可以选择“在静态库中使用MFC”或者“在动态链接库中使用MFC”,难道mfc提供了两套库吗?一套静态的,一套动态库?

2.在动态链接库的显示调用和隐式调用的过程中,dll都是在程序运行期才加载的吗?

2.根据我在网上看的教程,静态库没有入口函数,而动态链接库有入口函数,一般叫DllMain。为什么前者没有入口函数,而后者有呢?
------解决方案--------------------
1.静态库的.lib已经包含了的程序的编译后中间代码,在程序编译期间编译器会根据.h从这个.lib抽取程序代码到到程序中,所以运行是不需要DLL的支持。
2.动态库的.lib是描述DLL中程序函数偏移位置等函数信息,所以运行时需要DLL的支持。
使用静态库编译的程序比使用动态库编译的程序要大。
3.要和动态加载DLL和静态加载DLL概念区分开,静态加载DLL是用2方式实现的,动态加载DLL是用API(LoadLibrary,GetProcAddress和FreeLibrary)来实现的。
------解决方案--------------------
上面有误
动态库的.lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持.
------解决方案--------------------
静态加载DLL是发生在程序启动时,动态加载发生在调用api的时。
动态库的lib是对实现部分(.dll文件)的声明,.h是编译器的声明,动态库的lib是编译器LINK时候的声明。
MFC是有静态lib和动态lib,用静态lib方便编译出来的程序不依赖MFC的DLL,但程序的个头会比较大。
------解决方案--------------------
静态链接使用MFC库,就是将MFC相关的代码加入你自身的exe程序中,导致exe程序体积大,可以运行在没有装VS的计算器。而动态的话,exe程序体积小,在没有装过VS的机器上运行的话,就会出现应用程序出现错误,或者找不多dll之类的错误等等。

隐式链接就是#pragma comment(lib, "xxx.lib")方式或者在工程属性里配置使用,有效期一直到进程终止。动态加载就是以LoadLibrary()方式,不需要的时候可以随时FreeLibrary

之所以叫静态库,是因为在链接阶段,会将汇编生成的目标文件与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。如果静态库.lib更新了,所以使用它的应用程序都需要重新编译.
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。