dll文件和lib文件

参考了这篇文章http://www.cppblog.com/amazon/archive/2009/09/04/95318.htmlhttp://wenku.baidu.com/view/d9a6520e7cd184254b3535b4.html做个简明总结。

我们在程序中使用“pragma comment(lib, "a.lib")这个不一定是静态链接,这个只是告诉编译器,a.lib中包含我们源码中使用的函数的定位信息。我们使用这个语句的场景:

1.静态链接场景

我们用visual studio创建一个静态链接库的win32程序,生成一个a.lib,这个a.lib已经包含实际的二进制可执行代码,exe程序已经包含了a.lib的二进制代码,因此,exe程序可以独立运行,不需要a.lib附加文件。

2.动态链接场景

我们创建一个动态链接库,会产生两个文件,一个是a.lib,一个是a.dll。这里a.lib只是包含如何根据函数名或者序号找到他们在a.dll中实际的二进制代码位置,只是个索引。a.dll才包含真正的二进制代码。这样我们就可以包含一个.h的函数说明文件,然后在源码中直接使用函数,此时a.lib和a.dll都是exe程序执行必须附带的文件。

另外一种情况,就是我们对于动态生成的动态链接库的a.lib和a.dll,我们现在假设不想使用a.lib,那么我们就不需要加入相应函数声明的.h文件,而是使用系统函数LoadLibrary来获取相应函数的指针,只需要一个a.dll就足够了,系统会分析函数位置并动态加载他。

静态就是运行前就已经融合到可执行代码中的,导致文件大小增大。动态是运行时有可执行代码根据需要来加载,事前的文件比较小,但是增加了加载和寻找需要的函数的时间开销。

3.对于静态链接库,经过试验,如果只是采用#pragma comment(lib, "test.lib")这种形式,无论test.lib是否存在,都不影响项目的生成,这时test.lib只是作为一个提示。如果你拿着生成的lib,去给exe或者dll链接,它们就会在链接时报错,说找不到test.lib。如果test.lib作为vc的静态库项目的"附加依赖项",那么,test.lib就会被合并到最终生成的lib中去,所以此时如果找不到test.lib就会导致无法生成项目的lib。静态链接库项目中的”附加依赖项“中的lib会合并,也就是说,相当于我们执行类似的操作 lib.exe /out:all_in_one.lib a1.lib a2.lib,该操作的意思是合并a1.lib和a2.lib为一个名叫all_in_one.lib的静态库。

4.lib.exe还有很多其他选项,可以搜索 ”lib.exe msdn"了解详情

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值