前言:
    我这里所谓的静态链接,指通过包含dll的头文件与lib文件从而引用dll中的函数,变量和类的一种方法。
    要使用这种方法需准备两份头文件:一份用于dll工程,声明dll中的函数,变量和类将从dll中导出“__declspec(dllexport)”。一份用于可执行文件工程,声明了有一些函数,变量和类是从dll中导入的“__declspec(dllimport)”。1、既然是DLL(Dynamic动态),为什么还“静态”链接?
    这种方式的链接过程令我疑惑。我不明白既然是dll文件为什么还要链接lib文件?本来构造dll的目的是通过动态地加载以减少可执行文件的容量。这样一做是不是有违dll的初衷?
    我想到一种解释,就是所要包含的lib文件中并没有实质的代码,代码仍旧在dll中。那么这个lib里到底有什么?为什么要引入他?2、可执行文件是如何寻找dll文件的?
    在头文件中并没有包含dll文件的具体路径,可执行文件在加载执行时如何找到所需要的dll文件?

解决方案 »

  1.   

    1、动态连接库可以静态连接,就像使用静态库一样。但是它的好处还是体现在动态连接上。编译动态库生成的lib文件实际上不是2进制文件,你可以用VC打开看看,里边是dll的数据段描述和导出部分描述。2、静态连接的dll,就像使用静态库一样,在编译时期就已经连接到程序中了,所以这个时候的dll只是在编译连接的时候有用,运行时就不依赖于这个dll了。
      

  2.   

    要使用这种方法需准备两份头文件:一份用于dll工程,声明dll中的函数,变量和类将从dll中导出“__declspec(dllexport)”。一份用于可执行文件工程,声明了有一些函数,变量和类是从dll中导入的“__declspec(dllimport)”。
    用#ifdef
      #endif就可以写在一个头文件里面了。
      

  3.   

    您肯定吗?您肯定静态链接的dll实际上不需要dll?
      

  4.   

    我测试了,静态链接的dll实际上最后还需要dll文件。是动态链接。dll文件名在.lib文件中指定。
      

  5.   

    的确,是我的理解错误。静态连接在客户程序被装载时装载DLL,动态连接可以决定什么时候装载或卸出,还允许我们在运行时决定装载哪个DLL。但是都需要DLL,因为DLL工程的lib文件仅仅包含导出资源
      

  6.   

    静态连接的不用dll了,你可以试验一下,用vc编译一个执行文件到一个干净的98系统执行,如果不用静态编译,就会显示需要dll文件,而静态编译的就不会