C++中的LIB和DLL

参考:http://my.oschina.net/nicefan/blog/94409

编译型语言和解释型语言

高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可
将它们分为两类:
  1.解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由
相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不
能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可
以动态地调整、修改应用程序,典型的解释型的高级语言有BASIC。
  2.编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码
(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。
但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(*.OBJ)才
能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型
的,例如Visual C++、Delphi等。
高级语言里一个程序的编译和执行大概是 下面的情况:
编译器将高级语言从源代码翻译成与之等价的目标程序(就相当于从中文翻译成中文),而后就隐退了。在随后的某个时刻,
用户启动目标程序由操作系统执行。实现高级语言的另外一种方式为解释:
与编译不同的是,解释器在目标程序(其实根本就没有目标程序,只是与编译来对比)执行期间,解释器一直随之运行
。这种执行过程完全由解释器控制的。从效果上看,解释器实现了一台“虚拟计算机”,其“机器语言”就是高级语言,解释器一次读入一条或多条语句
,按照其自身规定的方式去执行相应的操作。一般说来,解释比编译有着很好的灵活性;编译一般有着较好的性能。


什么是LIB文件,和DLL关系如何:

(1)lib是编译时需要的,dll是运行时需要的。  
如果要完成源代码的编译,有lib就够了。  
如果也使动态连接的程序运行起来,有dll就够了。  
在开发和调试阶段,当然最好都有。  
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。  
(3)在动态库的情况下,有三个文件,一个是引入库(.LIB)文件,一个是DLL文件,一个是头文件。引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
 
一直没搞清楚编译dll后生成的lib 文件到底是干什么用的?如果采用静态连接,为什么老是需要lib文件?而通过loadlibrary则不需要?如果是静态连接,是否我的dll 程序一旦改动而从新编译过后,就还需要从新编译调用dll的程序? 
程序员在建立一个DLL文件时,链接程序会 自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出 函数的符号名和可选的标识号,但是并不含有实际的 代码。LIB文件作为DLL的替代文件被编译到 应用程序 项目中。 

当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中。可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。 
调用dll的export函数是不需要lib的,dll本身就是和lib同一个级别的东西,也提供类似的功能,调用dll函数只需要loadlibrary就行,但是你也发现,用loadlibrary很麻烦,要取出函数的地址,然后还要定义一个调用的原型。用dll比用静态链接库lib要麻烦得多。 

微软为了 解决这个问题,在编译dll的时候,顺便生成一个引入库lib文件,这个lib不包含实际功能代码,只不过用来帮你做那些loadlibrary的麻烦工作,让你用dll和用一般的lib一样方便。  
dll改过之后,只要export函数的声明没有修改,也就是参数、函数名、返回值没有发生变化,调用代码不需要重新编译。不过export函数声明修改过就必须重编译。 
使用动态dll有两种方法,一种是隐式链接,一种显示链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值