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

dll和lib关系及使用的更多相关文章

  1. Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系

    Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...

  2. .h头文件 .lib库文件 .dll动态链接库文件关系

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...

  3. Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系 动态库内存管理 动态链接库搜索顺序 符号解析和绑定 strlen函数的汇编实现分析

    Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...

  4. VS2010 C++环境下DLL和LIB文件目录及名称修改

    VS2010 C++环境下DLL和LIB文件目录及名称修改 转自:http://blog.csdn.net/archielau/article/details/8507581 DLL工程,Debug版 ...

  5. C++导出文件后缀dll,lib,exp,def

    简要的介绍一下在微软开发工具中(VC)静态链接库和动态链接库生成过程中出现的.dll  .lib  .def 和 .exp文件类型.windows平台上可执行文件可能是一个.exe文件也可能四个.dl ...

  6. dll和lib(包括静态链接库和与dll同时生成的lib)

    转:http://blog.csdn.net/galaxy_li/article/details/7411956 1:神马是Dll和Lib,神马是静态链接和动态链接 大家都懂的,DLL就是动态链接库, ...

  7. Linux的.a、.so和.o文件 对比 window下的dll,lib,exe文件

    连续几天终于将一个又一个问题解决了,这里说其中一个问题 描述问题:使用多线程pthread的时候,(我用的IDE,CODEBOLCKS)编译后发现直接弹出窗口,程序还没有被Build..巴拉巴拉,然后 ...

  8. 后缀名“.dll .obj .lib”和“ .so .o .a”文件的区别含义

    (1) .dll .obj .lib使用在windows平台下.        .dll:动态链接库,作为共享函数库的可执行文件.        .obj:目标文件,相当于源代码对应的二进制文件,未经 ...

  9. DLL和LIB的一些知识点(网上搜集)

    关于lib和dll的区别如下:(1)lib是编译时用到的,dll是运行时用到的.如果要完成源代码的编译,只需要lib:如果要使动态链接的程序运行起来,只需要dll.(2)如果有dll文件,那么lib一 ...

随机推荐

  1. Java基础语法(Eclipse)

    Java基础语法 今日内容介绍 u Eclipse开发工具 u 超市库存管理系统 第1章 Eclipse开发工具 Eclipse是功能强大Java集成开发工具.它可以极大地提升我们的开发效率.可以自动 ...

  2. 观察者模式和php实现

    观察者模式: 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅(Publ ...

  3. PhpStorm 2017汉化补丁 2017.1 免费中文版

    PhpStorm 2017汉化补丁是一款可以让PhpStorm 2017.1版实现中文界面显示的汉化包工具,本站提供了PhpStorm 2017.1汉化补丁下载地址,有需要的朋友们欢迎前来下载使用. ...

  4. js动态生成canvas

    最近看代码发现一个小现象,就是用js动态生成的canvas在浏览器审查元素的时候,发现它没有结束标签,但是不会影响canvas上图形的绘制,同时还有一点就是在动态设置canvas宽度和高度的时候,不要 ...

  5. android配置android studio not found target android-*.的问题

    列:not found target android-25, 打开下载android SDK的工具栏,找到android-25版本下载到你本地的sdk路径下就OK了.

  6. 转载《五大免费采集器哪个好,火车头,海纳,ET,三人行,狂人采集 》

    在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,ET,三人行,狂人. 下面我们对这几款采集工具作一个简单的评比. 1.火车头 基本上人人都知道,那就 ...

  7. python基础教程总结11——图形用户界面GUI

    1. 丰富的平台 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了 ...

  8. 使用ABAP批量下载有道云笔记中的图片

    Jerry喜欢用有道云笔记这款软件做自己的知识管理和知识体系的构建. 当您看到一篇好的有道云笔记分享时,可能会想将其精美的图片下载到本地.作为程序猿,我们不会去手动一张张下载.写个程序帮我们自动下载吧 ...

  9. 241个jquery插件—jquery插件大全

    jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多javascript高手加入其team. jQuery是继prototype之后又一个优秀的Javascrīpt框架.其经典 ...

  10. Maven settings.xml配置详解

    首先:Maven中央仓库的搜索全部公共jar包的地址是,http://search.maven.org/ ===Maven基础-默认中央仓库============================== ...