Visual Stdio的中的dll和lib

自己的一点点小笔记,留给将来需要的时候看看。

运行环境:windows7和VS2010

对于dll和lib两者的关系,需要理解的一个概念是编译时和运行时。

lib是编译时的东西,在lib里面包含了方法名和方法所在的dll名字,可以用dumpbin -all XXX.lib查看内容。
dll是运行时的东西,里面是方法的实体。可以通过depends查看里面的方法和引用的dll文件等。

举个例子方便理解:
有两个project,A和B,A的输出是一个动态dll,B的输出是一个exe。B需要用到A里面的类和方法等。

首先是对A的处理:要把A的类或方法定义为“导出型”,即使用关键字 _declspec(dllexport)
如把一个类定义为导出类: class _declspec(dllexport) BaseTool{}
并且在A的project里面把配置类型设为dll动态库,编译完毕的时候可以看到A.dll和A.lib两个文件。可以把A.dll和A.lib输出到两个不同的目录下。如下图所示:在“常规”->“输出目录”这边设置输出lib的文件夹,在“链接器”->"常规"->"输出文件"这边设置输出的dll文件,注意一个是文件夹,一个是文件。

图1



图2

编译完成之后,可以在指定的目录下面找到.lib和.dll。


对于B,也需要一系列的处理:

首先是头文件,需要把A里面对于类定义的头文件夹放到项目属性中的包含目录下,如下图:


图3

这里面发现了一个比较有意思的事情,原先我以为只要把头文件加到solution栏里面的项目头文件处就可以了(如下图),项目就会自动包含进来。没想到不是这样子的,关键还是在上图的包含目录里面加入头文件所在的文件夹路径,下图解决方案里面的可能只是方便开发人员打开头文件设置的,加不加不影响编译和运行。


图4


其次是附加库目录和附加依赖项:


图5


图6


附加库目录也可以通过图3中的‘库目录’替代,两者效果一样。

附加依赖项是包含所需要的lib文件,可以指定全路径,也可以只是指定名字,当只指定名字的时候,系统会在附加库目录或者库目录里面搜寻。如果不指定附加依赖项,也可以通过在代码里面加入#pragma comment(lib,"XXX.lib")来实现。


到此为止,编译应该是可以过了,但是具体运行的时候,会报出找不到dll的错误,这就是运行时错误了。
用dumpbin -all A.lib并重定向到一个txt文件中,可以看到lib里面有提到方法属于哪个dll,因此需要让它知道在哪里查找dll。
这时是运行时的事情了,需要设置系统环境变量,把dll所在目录加进去就可以了。如果是debug模式,需要重启VS。

其实lib文件可以不需要,而直接调用dll里面的方法。
采用LoadLibrary和GetProcAddress的方法,那样子可以不需要lib文件。但是有一个重大影响,就是得知道方法名的准确名字。特别是对于c++输出整个类的情形。 因为c++输出dll的时候,类的方法名都被打乱了,加入了很多的信息,所以一般情况下是不知道的,得通过def文件来重命名输出的方法名。

马马虎虎一笔流水账,算作博客第一份文章。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值