首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Visual Stdio的中的dll和lib

Visual Stdio的中的dll和lib

作者头像
bear_fish
发布2018-09-20 12:21:10
9250
发布2018-09-20 12:21:10
举报

http://blog.csdn.net/dodomouse/article/details/12843821

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

运行环境: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文件来重命名输出的方法名。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年05月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档