Visual Stdio的中的dll和lib

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

Linux入门到精pao通lu

2934
来自专栏小夜博客

LNMP1.3 安装 fileinfo 组件

3879
来自专栏用户2442861的专栏

HTTP POST GET 本质区别详解

    一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交

2822
来自专栏前端小叙

vue报错集锦

1、vue报错: 没安装 less-loader css-loader style-loader        可能的很大原因:没安装less 2、vuex报错...

4486
来自专栏程序员阿凯

一条大河波浪宽 -- 数据库连接池实现

1124
来自专栏Zchannel

#软件推荐#everything:windows下完美的文件搜索软件

1371
来自专栏散尽浮华

nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理

Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx可以用轮询、IP哈希、URL哈希等方式...

7096
来自专栏社区的朋友们

深入浅出 Nodejs( 二 ):Nodejs 文件模块机制

本篇教程关于Nodejs的文件模块机制,具体讲CommonJs规范以及Nodejs文件模块的实现原理。

4702
来自专栏我是攻城师

使用shell分页读取600万+的MySQL数据脚本

4045
来自专栏Golang语言社区

Golang语言社区--【游戏服务器知识】多线程并发

引言:上篇文章说到了多进程并发式的服务端模型,如上一篇文章所述,进程的频繁创建会导致服务器不堪负载,那这一篇博客主要讲述的是线程模型和线程池的方式来提高服务端的...

3324

扫码关注云+社区

领取腾讯云代金券