本帖最后由 shimachao 于 2014-03-06 09:22:53 编辑

解决方案 »

  1.   

    1.静态库的.lib已经包含了的程序的编译后中间代码,在程序编译期间编译器会根据.h从这个.lib抽取程序代码到到程序中,所以运行是不需要DLL的支持。
    2.动态库的.lib是描述DLL中程序函数偏移位置等函数信息,所以运行时需要DLL的支持。
    使用静态库编译的程序比使用动态库编译的程序要大。
    3.要和动态加载DLL和静态加载DLL概念区分开,静态加载DLL是用2方式实现的,动态加载DLL是用API(LoadLibrary,GetProcAddress和FreeLibrary)来实现的。
      

  2.   

    上面有误
    动态库的.lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持.
      

  3.   

    多谢版主大人回答!也就是说,不管是静态加载还是动态加载,都是在程序运行期间实现的?动态加载发生在调用api的时候,那静态加载是不是发生在程序启动时?动态库的lib文件相当于.h文件,那还是需要一个真正的.h吧?MFC有静态和动态两套库吗?
      

  4.   

    静态加载DLL是发生在程序启动时,动态加载发生在调用api的时。
    动态库的lib是对实现部分(.dll文件)的声明,.h是编译器的声明,动态库的lib是编译器LINK时候的声明。
    MFC是有静态lib和动态lib,用静态lib方便编译出来的程序不依赖MFC的DLL,但程序的个头会比较大。
      

  5.   

    静态链接使用MFC库,就是将MFC相关的代码加入你自身的exe程序中,导致exe程序体积大,可以运行在没有装VS的计算器。而动态的话,exe程序体积小,在没有装过VS的机器上运行的话,就会出现应用程序出现错误,或者找不多dll之类的错误等等。隐式链接就是#pragma comment(lib, "xxx.lib")方式或者在工程属性里配置使用,有效期一直到进程终止。动态加载就是以LoadLibrary()方式,不需要的时候可以随时FreeLibrary之所以叫静态库,是因为在链接阶段,会将汇编生成的目标文件与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。如果静态库.lib更新了,所以使用它的应用程序都需要重新编译.
    动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
      

  6.   

    谢谢斑竹大人回答,不过小弟还有一点不太清楚:
    关于动态链接库,为什么隐式调用不需要.lib文件,而动态调用需要.lib文件呢?
      

  7.   

    1.编译器有提供两套
    2.动态库也有显示加载和隐式,显示的会运行时加载,隐式的是exe已启动就加载,不过隐式也可以设置delayload来调用的时候加载
    3.dll入口函数是加载是的时候调用的,静态库是直接link进exe了,相当于代码重用。