dll和lib的区别

ib文件是在link的时候用  
.dll文件是在Run的时候用
 
lib   是静态链接库  
dll   是动态链接库
 
dll你需要和你的程序一起发布才行  
lib编译后就不需要了
 
lib将在连接时把一些代码拷贝到你的程序代码里,所以叫做静态连接  
dll是程序运行时把dll里的代码和资源加再到进程地址空间去,所以叫动态连接
 
动态链接与静态链接的不同之处在于:动态链接允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。
lib与dll文件最大区别在调用方面
dll可以静态陷入
 
.LIB 静态连接库(生成可执行文件)。  
.DLL动态连接库(运行时加载)。
 
.lib .dll都是编译了的可执行代码  
所不同的是,.lib中的执行代码的内容在你自己写的程序的编译过程中被拷贝了一份,而  
dll只是标记了一个对这个dll文件的某一段代码(函数)的引用,你的程序运行时必须有  
这一个.dll文件
 
调用方法存在不同
使用LIB,你在工程内部不用调用LoadLibrary及GetProcAddress.

 

关于DLL的函数:  
     动态链接库中定义有两种函数:导出函数(export   function)和内部函数(internal   function)。导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。  
   
  输出函数的方法有以下几种:  
  1、传统的方法  
          在模块定义文件的EXPORT部分指定要输入的函数或者变量。语法格式如下:  
  entryname[=internalname]   [@ordinal[NONAME]]   [DATA]   [PRIVATE]  
  其中:  
  entryname是输出的函数或者数据被引用的名称;  
  internalname同entryname;  
  @ordinal表示在输出表中的顺序号(index);  
  NONAME仅仅在按顺序号输出时被使用(不使用entryname);  
  DATA表示输出的是数据项,使用DLL输出数据的程序必须声明该数据项为_declspec(dllimport)。  
  上述各项中,只有entryname项是必须的,其他可以省略。  
       对于“C”函数来说,entryname可以等同于函数名;但是对“C++”函数(成员函数、非成员函数)来说,entryname是修饰名。可以从.map映像文件中得到要输出函数的修饰名,或者使用DUMPBIN   /SYMBOLS得到,然后把它们写在.def文件的输出模块。DUMPBIN是VC提供的一个工具。  
      如果要输出一个“C++”类,则把要输出的数据和成员的修饰名都写入.def模块定义文件。  
  2、在命令行输出  
          对链接程序LINK指定/EXPORT命令行参数,输出有关函数。  
  3、使用MFC提供的修饰符号_declspec(dllexport)  
          在要输出的函数、类、数据的声明前加上_declspec(dllexport)的修饰符,表示输出。__declspec(dllexport)在C调用约定、C编译情况下可以去掉输出函数名的下划线前缀。extern   "C"使得在C++中使用C编译方式成为可能。在“C++”下定义“C”函数,需要加extern   “C”关键词。用extern   "C"来指明该函数使用C编译方式。输出的“C”函数可以从“C”代码里调用。  
          例如,在一个C++文件中,有如下函数:  
          extern   "C"   {void     __declspec(dllexport)   __cdecl   Test(int   var);}  
  其输出函数名为:Test    
          MFC提供了一些宏,就有这样的作用。  
  AFX_CLASS_IMPORT:__declspec(dllexport)  
     
  AFX_API_IMPORT:__declspec(dllexport)  
  AFX_DATA_IMPORT:__declspec(dllexport)  
  AFX_CLASS_EXPORT:__declspec(dllexport)  
  AFX_API_EXPORT:__declspec(dllexport)  
  AFX_DATA_EXPORT:__declspec(dllexport)  
  AFX_EXT_CLASS:   #ifdef   _AFXEXT    
                                  AFX_CLASS_EXPORT  
                                  #else  
                                  AFX_CLASS_IMPORT  
  AFX_EXT_API:#ifdef   _AFXEXT  
                            AFX_API_EXPORT  
                            #else  
                            AFX_API_IMPORT  
  AFX_EXT_DATA:#ifdef   _AFXEXT  
                              AFX_DATA_EXPORT  
                              #else  
                              AFX_DATA_IMPORT 
     像AFX_EXT_CLASS这样的宏,如果用于DLL应用程序的实现中,则表示输出(因为_AFX_EXT被定义,通常是在编译器的标识参数中指定该选项/D_AFX_EXT);如果用于使用DLL的应用程序中,则表示输入(_AFX_EXT没有定义)。  
     要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:  
  class   AFX_EXT_CLASS   CTextDoc   :   public   CDocument  
  {  
          …  
  }  
   
  extern   "C"   AFX_EXT_API   void   WINAPI   InitMYDLL();  
   
          这几种方法中,最好采用第三种,方便好用;其次是第一种,如果按顺序号输出,调用效率会高些;最次是第二种。   
 
编译生成dll文件后,我们同时得到lib文件。这个lib和静态链接库的lib文件有何区别?谢谢!
怎么可能一样呢,和DLL一起生成.lib内只有函数名等信息,而不包括实现信息。
不一样.    
  1   静态lib中,有实现的代码  
  2   而dll输出的lib,只有连接信息.(即export项中的函数入口地址)  
      这样,   调用模块可以模拟这个lib去修改相应的import项
对,不一样。  
  静态lib链接后就不要lib的支持了,lib中的代码会合并到exe文件中。  
  dll的lib链接后还要dll的支持。
1        静态lib中,包含实现的二进制码,连接时直接连入Exe文件的地址空间。
2        dll输出的lib,仅含导出函数的地址和一些位址信息,可以帮助Link程序完成连接(在此时安排调用入口地址及函数回调信息)。这样,在运行时才将DLL中真正的代码调入执行,实现动态连接。
那我想知道静态的Lib怎么作?
怎么将DLL作为静态编译。
VC里有lib和implib,   都可以从.dll产生对应的.lib  
  如:lib   /DEF:SCSIIO.DLL
如何从dll文件导出对应的lib文件?  
  Visual   C++   开发工具提供了两个命令行工具,一个是dumpbin.exe,另一个是lib.exe。利用这两个工具即可从dll导出其对应的lib。  
  1、在命令行执行:  
  dumpbin   /exports   yourdll.dll   >   yourdll.def  
  2、编辑   yourdll.def   文件,使之格式与.def文件格式一致。比如:  
  EXPORTS;  
                fn1;  
                fn2;  
  3、在命令行执行:  
  lib   /def:yourdll.def   /machine:i386   /out:yourdll.lib

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinlking/archive/2009/01/12/3757300.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值